делегировать HTTP-запрос Джерси

У меня есть веб-сервер на основе Nano HTTP, который должен делегировать свои вызовы Джерси 2.22.2. На конструкторе класса webserver я объявляю ApplicationHandler в качестве переменной экземпляра:

    ApplicationHandler newHandler;

Затем в конструкторе инициализирую его и регистрирую образец класса ресурса:

    Object[] instances = new Object[1];
    instances[0] = new SampleResource();

    ResourceConfig app = new ResourceConfig();
    app.registerInstances(instances);
    newHandler = new ApplicationHandler(app);

В методе, обрабатывающем Http-запросы, я создаю ContainerRequest и выполняю метод apply в обработчике приложения :

                SecurityContext secContext = new SecurityContext() {
                @Override
                public Principal getUserPrincipal() {
                    return new Principal() {
                        @Override
                        public String getName() {
                            return "user";
                        }
                    };
                }

                @Override
                public boolean isUserInRole(String s) {
                    return true;
                }

                @Override
                public boolean isSecure() {
                    return true;
                }

                @Override
                public String getAuthenticationScheme() {
                    return null;
                }
            };
            PropertiesDelegate propertiesDelegate = new PropertiesDelegate() {

                Map<String, Object> props = new HashMap<>();
                @Override
                public Object getProperty(String s) {
                    return props.get(s);
                }

                @Override
                public Collection<String> getPropertyNames() {
                    return props.keySet();
                }

                @Override
                public void setProperty(String s, Object o) {
                    props.put(s, o);
                }

                @Override
                public void removeProperty(String s) {
                    props.remove(s);
                }
            };
            ContainerRequest request = new ContainerRequest(new URI("http://localhost:2000"), new URI("/test"), session.getMethod().toString(), secContext, propertiesDelegate);
            Future<ContainerResponse> responseFuture = newHandler.apply(request);
            ContainerResponse response = responseFuture.get();
            Object entity = response.getEntity();

Ниже приведен код для класса SampleResource :

public class SampleResource {

@GET
@Path("test")
public Response testMethod() {
    return Response.status(Response.Status.OK).build();
}

}

Основная причина этого заключается в том, что я хочу вызвать пользовательский API, который вставляет объекты в аннотированные классы ресурсов.
Шагая через код, все, что я получаю, это NotFoundException.

1 ответ

  1. Если требуется ввести пользовательские объекты в класс resources, это можно сделать в двух waus

    1. использование @Context — добавление пользовательского объекта в контекст приложения
    2. usign @Inject — путем привязки приложения к конфигурации ресурсов

    чтобы использовать @Context, необходимо расширить java.безопасность.Основной объект и объявить поля объекта, а также можно создавать экземпляры и назначать значения с помощью контекста безопасности.

    чтобы user @InJect, необходимо зарегистрировать организацию.glassfish.hk2.коммунальные услуги.переплет.AbstractBinder, как показано ниже

    public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages("org.foo.rest;org.bar.rest");
       register(new AbstractBinder() {
            @Override
            protected void configure() {
                bindFactory(ObjectThatneedtoInject.class).to(yourClass.class);
            }
        });
    }
    

    }