使用以下依赖项(Gradle):
org.glassfish.jersey.containers:jersey-container-servlet:2.22.2
org.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小时内,我需要通过码头,泽西岛,或其他一些图书馆或者使用某种语境依赖注入的理解(焊接似乎出现了很多),并尝试各种组合@Inject
,@Context
等等等等,但得出的结论是我不知道自己实际上在做什么……我什至不确定我是否对这种情况了解得足够多,无法正确地表达我的问题。
可根据要求提供更多信息。
任何帮助表示赞赏。
编辑:在此处添加了指向https://github.com/englishbobster/JersetAndJetty的链接
使用@peeskillets建议,但仍然无法正常工作。
使DI起作用的第一件事是AbstractBinder
。这是使对象可用于注入的地方。
class Binder extends AbstractBinder {
@Override
protected void configure() {
bind(modelAdapter).to(ModelAdapter.class);
}
}
然后,您需要在泽西岛注册活页夹。最简单的方法是在泽西岛(Jersey's)注册ResourceConfig
。在您的情况下,您不使用一个。您正在“ web.xml”中配置所有内容。为此,您应该看一下这篇文章。
如果您想将配置更改为使用ResourceConfig
,我个人希望使用,则可以执行此操作
package com.some.pkg;
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
packages("mypackage.jersey.generated.api.service");
property(ServerProperties.MEDIA_TYPE_MAPPINGS, "json : application/json");
register(new Binder());
}
}
然后使用Jetty进行配置,您可以
servlet.setInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS,
"com.some.pkg.JerseyConfig");
现在,您可以删除其他两个init参数,因为您正在中配置它ResourceConfig
。
没有任何init-params的另一种方法是执行
ResourceConfig config = new JerseyConfig();
ServletHolder jerseyServlet = new ServletHolder(ServletContainer(config));
context.addServlet(jerseyServlet, "/*");
请在此处查看最后一个代码段的完整示例。
现在,您只需ModelAdapter
在泽西岛的任何地方注入
在田野里
@Inject
private ModelAdapter adapter;
或在建设者中
@Inject
public RestApi(ModelAdapter adapter) {
this.adapter = adapter;
}
或方法参数
@GET
public Response get(@Context ModelAdapter adapter) {}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句