我在嵌入式Web服务器(Jetty)中运行RESTEasy.
我的资源需要访问后备数据存储,其配置在用于启动我们的应用程序的命令行上传递.
理想情况下,我会在资源的构造函数中注入支持数据存储资源:
@Path("/")
public class MappingService{
private final RecordManager recman;
public MappingService(RecordManager recman) {
this.recman = recman;
}
@PUT
@Path("/mapping/{key}")
@Produces({MediaType.APPLICATION_JSON, "application/*+json"})
public Response createMapping(@PathParam("key") String key, @QueryParam("val") String val) {
// do stuff with recman ...
}
}
理想情况下,我将RecordManager对象配置在应用程序的其他位置,然后使其可用于MappingService构造函数.
我看到我可以使用Application对象返回特定的单例实例.但看起来RESTEasy构造了Application对象本身 – 所以我没有看到任何方法将配置对象传递给Application单例.
那么:如何将外部实例化的对象传递给我的资源处理程序?
我发现这篇文章(Share variables between JAX-RS requests)描述了如何使用上下文监听器将对象添加到上下文并将其拉入资源处理程序 – 但这太可怕了 – 我必须采取应该是POJO的东西然后我突然做了它高度依赖于它的容器.请告诉我有更好的方法!
解决方法:
好的 – 我已经弄明白了 – 在这里记录以防万一其他人点击这个.
诀窍在于利用@Context注入来注入我想要的资源,而不是获取对servlet上下文的引用.如果您对RestEASY引导过程有一些控制(而不是使用从web.xml中指定的类名构造的上下文侦听器进行引导,我们以编程方式注册上下文侦听器),则可以执行此操作.
我正在使用Jetty作为我的servlet容器.这是我的主要方法:
public static void main(String[] args) throws Exception {
final RecordManager recman = createRecordManager(args);
Server server = new Server(DEFAULT_HTTP_PORT);
try {
WebAppContext webAppContext = new WebAppContext();
webAppContext.setContextPath("/");
webAppContext.setWar(WAR_LOCATION);
webAppContext.addEventListener(new org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap(){
@Override
public void contextInitialized(ServletContextEvent event) {
super.contextInitialized(event);
deployment.getDispatcher().getDefaultContextObjects().put(RecordManager.class, recman);
}
});
webAppContext.addServlet(org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.class, "/*");
webAppContext.setServer(server);
server.setHandler(webAppContext);
server.start();
} catch (Exception e) {
logger.error("Error when starting", e);
server.stop();
}
}
然后我的资源处理程序看起来像这样:
@Path("/")
public class MappingResource {
private final RecordManager recman;
public MappingResource(@Context RecordManager recman) { //<-- sweet! resource injection
this.recman = recman;
}
@PUT
@Path("/mapping/{key}")
@Produces({MediaType.APPLICATION_JSON, "application/*+json"})
public Response createMapping(@PathParam("key") String key, @QueryParam("val") String val) {
// do something with recman, key and val
}
}
为了彻底,这里是web.xml条目(这只是通用的resteasy配置):
<context-param>
<param-name>resteasy.resources</param-name>
<param-value>my.package.MappingService</param-value>
</context-param>
标签:java,jax-rs,resteasy 来源: https://codeday.me/bug/20190703/1366320.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。