java - 为什么我的 Jersey JAX-RS 服务器抛出一个关于不在 RequestScope 中的 IllegalStateException?

标签 java jersey jax-rs

我已经关注这个问题太久了,找到了解决方案,并希望为后续的任何其他勇敢的 JAX-RS 冒险者提供反馈。

错误:

java.lang.IllegalStateException: Not inside a request scope.
    at com.google.common.base.Preconditions.checkState(Preconditions.java:149)
    at org.glassfish.jersey.process.internal.RequestScope.current(RequestScope.java:226)
    at org.glassfish.jersey.process.internal.RequestScope.findOrCreate(RequestScope.java:154)
    at org.jvnet.hk2.internal.MethodInterceptorImpl.intercept(MethodInterceptorImpl.java:80)
    at org.glassfish.jersey.internal.inject.UriInfoInjectee$$EnhancerByCGLIB$$4cfd1aab.toString(<generated>)
    at java.lang.String.valueOf(String.java:2854)
    at java.lang.StringBuilder.append(StringBuilder.java:128)
    at au.csiro.esa.authrest.rest.resource.PingResource.setUriInfo(PingResource.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.glassfish.hk2.utilities.reflection.ReflectionHelper.invoke(ReflectionHelper.java:1011)
    at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:816)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:801)
    at org.glassfish.jersey.gf.cdi.CdiComponentProvider$1.inject(CdiComponentProvider.java:316)
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:158)
    at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:103)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:93)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:79)
    at au.csiro.esa.authrest.rest.resource.PingResource$Proxy$_$$_WeldClientProxy.ping(Unknown Source)
....

它是一个标记为 @RequestScoped 的简单资源

@Path("ping")
@RequestScoped
public class PingResource {

    protected UriInfo uriInfo;

    @Context
    public void setUriInfo(UriInfo uriInfo) {
        System.out.println("UserResource - set uriInfo:"+uriInfo);
        this.uriInfo = uriInfo;
    }

    @Inject
    @PropertiesFile(name = "app")
    Properties properties;

    @PermitAll
    @GET
    @Produces({ MediaType.TEXT_PLAIN })
    public Response ping() {
        System.out.println("Hit ping");
        return Response.ok().entity("Running version " + properties.getProperty("application.version")).build();
        // return Response.ok().entity("Running version 10").build();
    }
    ....

最佳答案

答案是 URIInfo 上的 @Context。它必须是这样的:

public void setUriInfo(@Context UriInfo uriInfo) {
        System.out.println("UserResource - set uriInfo:"+uriInfo);
        this.uriInfo = uriInfo;
    }

@Context
protected UriInfo uriInfo;

看起来很明显不是吗!异常提到 URIInfo 那么我的问题是什么?我不知道,我只能认为我看到了与这个错误完全一样的东西,是由其他东西引起的,我改变了一些不正确的东西(就像你在顶部看到的大代码块一样)。异常似乎是一样的,它没有点击我实际上导致了不同的错误。

无论如何,我正走开,夹着尾部,并为自己找出了问题的原因和解决方案而感到有些高兴。网上没有任何内容,所以我想我会与大家分享这个。

关于java - 为什么我的 Jersey JAX-RS 服务器抛出一个关于不在 RequestScope 中的 IllegalStateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119108/

相关文章:

java - levelDB:.sst 文件在关闭 DB 后仍然打开

java - Jersey Restful API 验证

java - 如何在 Jersey/JaxB 中将嵌套集合从 POJO 编码到 XML?

java - Jackson Serializer 未调用 Jersey Jax-RS

java - 文件更改时获取 JAX-RS java.lang.NullPointerException

Java REST 服务应答需要太多时间

javascript - 如何使用 Angular JS 将 Base64 编码的字符串转换为 json 字符串

java - 构造具有未知子类型的 Java 泛型

java - 测试随机盐法

java - RESTEASY 抛出查询参数为空的异常