В причале/jersey2 резидентных приложения API конечных точек генерируются программно внутри ApiServiceConfig класса ConfigurationProperties
класса считывает и загружает файл свойства в java.util.Properties
класса.Инициировать распознаватель зависимости джерси внутри ResourceConfig
Создание экземпляра сервера Jetty осуществляется следующим образом.
// Create and register resources
final ResourceConfig resourceConfig = new ApiServiceConfig()
.register(new DependencyInjectionBinder());
ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/mydomain/api");
Server jettyServer = new Server(8585);
jettyServer.setHandler(contextHandler);
ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
contextHandler.addServlet(jerseyServlet, "/*");
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
jettyServer.destroy();
}
public class ApiServiceConfig extends ResourceConfig {
public ApiServiceConfig() {
for(JsonNode jsonNode: nodeArray) {
// JSON endpoint service description example.
//{
// "service": "/item/{id}",
// "method": "GET",
// "process": {
// "@type": "com.mycompany.projectx.endpoint.services.GetController",
// "uri_param": "id",
// "type": "item",
// "fields": "uuid,name,content_area,title,grade,dok,bloom,item_banks,...,item_banks_titles"
// }
//}
// Json property "service" describes a URL pattern for a request (eg. "/item/{id}").
final String path = jsonNode.get("service").asText();
// Api RESTful verb ('GET', 'POST', etc.)
final String method = jsonNode.get("method").asText();
// Map a process description of a service to specific controller implementation class.
// This is the instance creation where I want injection to happen.
IController controller = this.objectMapper.convertValue(jsonNode.get("process"), AbstractBaseController.class);
// Controller is added to a HashMap
...
final Resource.Builder resourceBuilder = Resource.builder();
resourceBuilder.path(path);
final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod(method);
methodBuilder.produces(new MediaType("text", "plain"))
handledBy((Inflector)(ctx) -> {
// Controller is retrieved from the HashMap
controller.execute(new ProcessEvent());
...
return responseResult;
});
final Resource resource = resourceBuilder.build();
registerResources(resource);
}
}
}
GetController
public class GetController extends AbstractBaseController {
@Config("data.cassandra")
String connectionString; // == null, but should be a string injected.
public GetController() {
}
@Override
public ProcessEvent process(ProcessEvent event) throws Exception {
String uri_param = this.uri_param;
event.contentType = "application/json";
event.object = ".Get method of Item endpoint got executed. Cassandra IP: " + getApplicationProperties().getProperty("data.cassandra");
return event;
}
Dependency распознаватель связующий зарегистрирован в DependencyInjectionBinder
классе:
public class DependencyInjectionBinder extends AbstractBinder {
@Override
protected void configure() {
bind(ConfigInjectionResolver.class)
.to(new TypeLiteral<InjectionResolver<Config>>() {})
.in(Singleton.class);
}
}
ConfigInjectionResolver реализует InjectionResolver и решить некоторую логику.
ApiServiceConfig
в цикле проходит описания и создает конечные точки. Для каждой конечной точки создается построитель ресурсов, заполняется и регистрируется ресурс. При создании конечной точки ресурса класс создается с помощью ДЖЕКСОНА-DataBind:
IController controller = this.objectMapper.convertValue(jsonNode.get("process"), AbstractBaseController.class);
Этот класс должен получить другой класс впрыскивается. Resolver DependencyInjectionBinder не срабатывает, когда создается экземпляр controller
. Если я перенучу экземпляр DependencyInjectionBinder в конструктор ApiServiceConfiguration в качестве первой операции, инъекция свойства в экземпляр controller
не произойдет.
Однако, когда я зарегистрировать класс, определенный конечной точки:
resourceConfig.register(AnEndpointClass.class);
DI разрешителя пинки в и добавляет зависимость.
Как заставить зависимый преобразователь работать для экземпляров классов при программном создании и регистрации конечных точек?
_ "ApiServiceConfig в цикле проходит через описание и создает конечные точки. Для каждого строитель конечных точек ресурсов создаются, заполняется и ресурс зарегистрирован. При создании конечной точки ресурса класс конкретизируются с помощью ДЖЕКСОН-DataBind : "_ - Можете ли вы на самом деле показать это в коде. –
В принципе, вы не предоставили достаточно информации для воспроизведения проблемы. Есть много недостающих вещей. Я не могу догадаться, что вы делаете. –
@peeskillet обновлен. Спасибо за внимание! – Maxim