java - Jersey - 尽管非空初始化,资源变量仍为空值

标签 java spring rest jersey spring-jersey

我的 Jersey REST api 中有一个资源,它有一个私有(private)实例变量:

@Path("test")
public class TestResource implements ServletContextListener
{
    private String someString;

    @GET
    public void test()
    {
        System.out.println("someString " + someString);
    }

    @Override
    public void contextDestroyed(ServletContextEvent ctxt) {
        System.out.println("Destroying context");
    }

    @Override
    public void contextInitialized(ServletContextEvent ctxt) {
        System.out.println("TestResource initialized!");

        someString = "SET";
        System.out.println("someString has been set. someString: " + someString);
    }
}

在服务器启动/重新启动时,实例变量 someStringcontextInitialized() 期间初始化,并正确打印出来。但是,当我将 GET 请求设置为 http://localhost:8080/myapp/api/test (即调用 test() 方法上面)变量 someStringnull

如何防止这种情况发生?

最佳答案

来自 JAX-RS 规范:

By default a new resource class instance is created for each request to that resource.

因此,您在资源类实例上设置的任何状态都是毫无意义的,因为该实例永远不会再次使用。如果您想保留某个值,请将其放在 ServletContext’s attributes 中:

// All classes in the web app share a ServletContext, so attribute names
// need to start with package names to prevent collisions.
private static final String SOME_ATTRIBUTE = TestResource.class.getName() + ".someAttribute";

@Override
public void contextInitialized(ServletContextEvent ctxt) {
    System.out.println("TestResource initialized!");

    String someString = "SET";
    System.out.println("someString has been set. someString: " + someString);

    ctxt.getServletContext().setAttribute(SOME_ATTRIBUTE, someString);
}

@GET
public void test(@Context ServletContext context) {
    System.out.println("someString " + context.getAttribute(SOME_ATTRIBUTE));
}

静态字段中存储值将要求您实现线程安全,并且无法在分布式生产环境中工作。

关于java - Jersey - 尽管非空初始化,资源变量仍为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47660029/

相关文章:

java - 如何在phonegap android中隐藏地址栏

java - 通过 SOAP 流式传输?

json - 如何在 REST 中处理 @OneToMany 关系

java - 如何从 Java 在 AWS 中生成签名

rest - 使用 REST API 对订阅进行 PayPal Sandbox 负面测试

java - 我做了一个初学java "math"但不知道错误在哪里

java - 如何在 Haskell 中使用指向父子项的指针编写对象树?

spring - 使用 current_session_context_class 属性 hibernate 3 hibernate 4

css - 我的 css 文件没有加载

rest - 我可以使用 ADFS 在 Grails 中为我们的 Rest Api 项目实现 SSO 吗?