java - Jersey 工厂尝试创建 @Context 变量两次

标签 java spring spring-boot jersey spring-jersey

我在使用 Jersey 2.26Spring Boot 2 时遇到问题。

我添加了一个工厂来将 @Context 变量注入(inject)到方法中,但它执行了两次,第一次是在方法之前,然后是在方法之后:

@GET
@Path("/user-entitlements")
public Set<String> getUserEntitlements(@Context User user) {
    return service.getUserEntitlements(user);
}

我有一个创建这些用户的工厂:

public class UserFactory implements Factory<User> {

    private final User user;

    @Inject
    public UserFactory(HttpServletRequest request, RequestIdentityService requestIdentityService) {
        String userName = requestIdentityService.getCurrentUser(request);
        user = new User(userName);
    }

    @Override
    public User provide() {
        return user;
    }

    @Override
    public void dispose(User instance) {
    }
}

在 Jersey 配置中我注册了这个工厂:

    register(
        new AbstractBinder() {
            @Override
            public void configure() {
                bindFactory(UserFactory.class)
                    .to(User.class)
                    .in(RequestScoped.class);
            }
        }
    );

以前工作正常,但在我将应用程序升级到 jersey 2.26 和 spring boot 2 后,它停止工作并抛出异常:

java.lang.IllegalStateException: Proxiable context org.glassfish.jersey.inject.hk2.RequestContext@3a94c454 findOrCreate returned a null for descriptor SystemDescriptor(
    implementation=org.glassfish.jersey.inject.hk2.SupplierFactoryBridge
    contracts={javax.servlet.http.HttpServletRequest}
    scope=org.glassfish.jersey.process.internal.RequestScoped
    qualifiers={}
    descriptorType=PROVIDE_METHOD
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@464366a8
    proxiable=true
    proxyForSameScope=false
    analysisName=null
    id=20
    locatorId=0
    identityHashCode=1360647282
    reified=true) and handle ServiceHandle(SystemDescriptor(
    implementation=com.rest.UserFactory
    contracts={org.glassfish.hk2.api.Factory}
    scope=org.glassfish.hk2.api.PerLookup
    qualifiers={}
    descriptorType=CLASS
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@33335025
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=172
    locatorId=0
    identityHashCode=790201459
    reified=true),1915928862)

出现异常是因为 UserFactory 被调用了两次。首先在调用 getUserEntitlements 之前调用它,以注入(inject)用户。 但该方法返回后,它会再次被调用(这次它得到一个不允许某些操作的 HttpRequest 实现)。

为什么它可以被调用两次? 就好像我会要求它增强请求和响应一样。

最佳答案

问题在于,在新泽西州,他们从 hk2 转移到其上方的抽象层,并使代码支持 Java 8(因为它是 Java EE 8 - https://jersey.github.io/release-notes/2.26.html 的实现)。

所以为了解决这个问题,我必须:

  1. 导入正确的AbstractBinder -org.glassfish.jersey.internal.inject.AbstractBinder (不是来自 HK2 的上一个 - org.glassfish.hk2.utilities.binding.AbstractBinder)。

  2. 更新工厂以实现 Supplier<User>而不是Factory<User> .

之后,一切都像以前一样工作,工厂仅被调用一次。

关于java - Jersey 工厂尝试创建 @Context 变量两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454101/

相关文章:

java - 标准化给定国家/地区代码的电话号码

spring - 如何在 Spring 3.0 中拥有 flash 范围功能?

java - 在 spring data jpa Base Repository 中按 id 查找

spring-boot - keycloak 是否支持 mongodb 作为数据库?

带有 Spring Boot 自动配置的 Grails 3

java - 调用 fragment Activity 错误无法实例化 Activity 。无法转换为 android.app.Activity

java - 如何从 Firebase 中检索 ListView 中的数据

java - 如何在不损失纳秒级精度的情况下使用 TimeUnit.timedWait()?

java - Spring 启动: JPA query (JPQL) do not work but works when change to native query

spring-boot - 将 spring boot 微服务部署到 heroku