【发布时间】:2016-05-18 14:04:16
【问题描述】:
使用以下依赖项(Gradle):
org.glassfish.jersey.containers:jersey-container-servlet:2.22.2org.eclipse.jetty:jetty-servlet:9.3.2.v20150730
我有一个嵌入式 Jetty 服务器,带有一个 Jersey servlet 容器......像这样......
package mypkg.rest.jersey;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.servlet.ServletContainer;
import se.transmode.tnm.alarm.api.AlarmRetrieval;
import mypkg.rest.RestServer;
import mypkg.rest.jersey.serviceImpl.ModelAdapter;
public class JerseyBasedRestServer implements RestServer {
public static final int INITIALIZE_ON_USE = 0;
private Server server;
private final ServletContextHandler context;
private final ServletHolder servlet;
private final ModelAdapter modelAdapter;
public JerseyBasedRestServer(BusinessObjects businessObjects) {
this.modelAdapter = new ModelAdapter(businessObjects); //I want this instance to somehow be available for my ServletContainer to use.
context = new ServletContextHandler(ServletContextHandler.SESSIONS);
servlet = context.addServlet(ServletContainer.class, "/*");
servlet.setInitOrder(INITIALIZE_ON_USE);
servlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "mypackage.jersey.generated.api.service");
servlet.setInitParameter(ServerProperties.MEDIA_TYPE_MAPPINGS, "json : application/json");
context.setContextPath("/");
}
private void startServlet() {
try {
servlet.start();
servlet.initialize();
} catch (Exception e) {
log.error("Failed to initialize servlet. {}", e.getMessage());
}
}
@Override
public void init(int port) {
server = new Server(port);
server.setHandler(context);
try {
server.start();
server.join();
startServlet();
} catch (Exception e) {
log.error("Failed to start jetty server for rest interface");
} finally {
server.destroy();
}
}
Jersey Container 将运行使用 Swagger 代码生成工具生成的服务器代码和模型
https://github.com/swagger-api/swagger-codegen#getting-started
提供生成的模型 JacksonJsonProvider 和 RestApi 类:
package mypackage.jersey.generated.api.service
Path("/")
public class RestApi {
private final RestApiService delegate = new RestApiServiceImpl(); //Integration point of the generated code
@GET
@Path("/list/")
@Consumes({ "application/json" })
@Produces({ "application/json" })
public Response retrieveAlarmList(@Context SecurityContext securityContext) throws NotFoundException {
return delegate.retrieveAlarmList(securityContext);
}
}
为了集成生成的代码,我们需要自己实现RestApiServiceImpl。
ModelAdapter 的工作是将我们的业务对象转换为生成的休息模型。
所以问题是我如何使我们的业务对象的适配器实例,在本例中为 ModelAdapter,它位于 Jersey servlet 上下文的上下文之外,可用于 RestApi 类,或者更确切地说RestApiServiceImpl?
我从过去 24 小时的阅读中了解到,我需要通过 Jetty、Jersey 或其他一些库(Weld 似乎经常出现)使用某种上下文依赖注入,并尝试了 @ 的各种组合987654334@、@Context 等,但得出的结论是我不知道我实际上在做什么......我什至不确定我对这种情况的了解是否足够正确地表达我的问题。
可应要求提供更多信息。
感谢任何帮助。
编辑:在此处添加了指向https://github.com/englishbobster/JersetAndJetty的链接
使用@peeskillets 建议,但仍然无法正常工作。
【问题讨论】:
标签: dependency-injection jersey jersey-2.0 embedded-jetty