java – Jersey Rest Service的ResourceConfig和ServletContextListener之间的区别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Jersey Rest Service的ResourceConfig和ServletContextListener之间的区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2931字,纯文字阅读大概需要5分钟。
内容图文
![java – Jersey Rest Service的ResourceConfig和ServletContextListener之间的区别](/upload/InfoBanner/zyjiaocheng/809/0bbf1fe5bdb04d248541dc62c950759e.jpg)
我想初始化Jersey Rest服务并引入一个全局应用程序范围的变量,该变量应该在应用程序启动时计算,并且应该在每个rest资源和每个方法中可用(此处由整数globalAppValue = 17表示,但将是一个复杂的对象后来).
为了初始化服务并在启动时计算一次值,我发现了两种做法:一般的ServletContextListener和Jersey ResourceConfig方法.但是我还没有理解他们俩之间有什么区别?两种方法在启动时触发(两者都打印System.out-messages).
这是我的ServletContextListener的实现,它工作正常:
public class LoadConfigurationListener implements ServletContextListener
{
private int globalAppValue = 17;
@Override
public void contextDestroyed (ServletContextEvent event)
{
}
@Override
public void contextInitialized (ServletContextEvent event)
{
System.out.println ("ServletContext init.");
ServletContext context = event.getServletContext ();
context.setAttribute ("globalAppValue", globalAppValue);
}
}
这是Jersey Rest ResourceConfig方法的实现,其中ServletContext不可用.以后可以通过使用资源方法注入来提供此Application对象:
@ApplicationPath("Resources")
public class MyApplication extends ResourceConfig
{
@Context
ServletContext context;
private int globalAppValue = 17;
public MyApplication () throws NamingException
{
System.out.println ("Application init.");
// returns NullPointerException since ServletContext is not injected
context.setAttribute ("globalAppValue", 17);
}
public int getAppValue ()
{
return globalAppValue;
}
}
这是我希望在资源方法中获取全局值的方式:
@Path("/")
public class TestResource
{
@Context
ServletContext context;
@Context
MyApplication application;
@Path("/test")
@GET
public String sayHello () throws SQLException
{
String result = "Hello World: ";
// returns NullPointerException since application is not injected
result += "globalAppValue=" + application.getAppValue ();
// works!
result += "contextValue=" + context.getAttribute ("globalAppValue");
return result;
}
}
因此,虽然经典的ServletContextListener工作正常但我使用ResourceConfig / Application时遇到了一些问题,但是更喜欢这种方式,因为它似乎更多地本地集成到Jersey中.所以我的问题是哪种方式是最佳实践.谢谢!
解决方法:
您只需调用property( key, value )即可在ResourceConfig中设置属性.
public MyApplication() {
property("MyProp", "MyValue");
}
在您的资源类中,您只能注入ResourceConfig扩展的超级抽象类javax.ws.rs.core.Application.
然后你可以做的是调用Application API方法之一来获取set属性.该方法当然命名为getProperties(),它返回属性的映射.
@Path("/")
public class TestResource
{
@Context
Application application;
@GET
public String get() {
String value = (String)application.getProperties().get("MyProp");
}
}
此外,通过在ResourceConfig上使用属性方法,该属性被放入一个全局javax.ws.rs.core.Configuration对象,该对象也是可注入的.因此,您可以注入Configuration,而不是Application
@Path("/")
public class TestResource
{
@Context
Configuration config;
@GET
public String get() {
String value = (String)config.getProperty("MyProp");
}
}
也可以看看:
> Using a custom hk2 InjectionResolver to inject application configuration用于其他一些有趣的方法来注入值而不必从应用程序或配置中检索它
内容总结
以上是互联网集市为您收集整理的java – Jersey Rest Service的ResourceConfig和ServletContextListener之间的区别全部内容,希望文章能够帮你解决java – Jersey Rest Service的ResourceConfig和ServletContextListener之间的区别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。