dependency-injection - 在 Jersey 过滤器中注入(inject) EJB

标签 dependency-injection jersey ejb

我目前正在开发一个以 Jersey JAX-RS 作为后端,AngularJS 作为前端的应用程序;我需要一种身份验证,因此对于每个请求,我都会发送一个应该由后端验证的 token 。为此,我决定创建一个 Jersey 过滤器来查找该 token ,然后调用我的 AuthenticateService 来检查用户是否可以通过身份验证。
然后授权由 @RolesAllowed 管理。注解。

这是我的问题:我不能在 Jersey 过滤器中注入(inject) EJB,奇怪的是因为它对资源很有用。但是使用过滤器,服务总是保持

知道如何欺骗它吗?
谢谢

过滤代码:

@Provider
@Priority( Priorities.AUTHORIZATION )
public class AuthenticationFilter implements ContainerRequestFilter {

    @EJB( name=AuthenticationService.LOOKUP_NAME)
    private AuthenticationService authService;

    @Override
    public void filter( ContainerRequestContext requestContext ) throws IOException {
        /**
         * Get headers parameters
         */
        String userIdStr = requestContext.getHeaderString( SecurityConsts.HEADER_ID_PARAMETER );
        int userId = 0;

        if( userIdStr != null && !userIdStr.isEmpty() ) {
            userId = Integer.parseInt( userIdStr );
        }

        String securityToken = requestContext.getHeaderString( SecurityConsts.HEADER_TOKEN );

        User user = null;

        /**
         * If a token is present, try to authenticate the user
         */
        if( securityToken != null && !securityToken.isEmpty() ) {
                    // NullPointerException happens here
            user = authService.authenticateWithToken( userId, securityToken );
        }

        /**
         * Set correct security context
         */
        requestContext.setSecurityContext( new ConfiguratorSecurityContext( user ) );
    }

}

最佳答案

这是一个或多或少知道的问题。

JAX-RS 2.0 does not support injection of EJBs into JAX-RS components (providers, resources).



但是有一些选项可以解决这个问题。
  • 您可以尝试切换到 CDI,例如将您的服务变成 @ManagedBean并使用 @Inject .
  • 您可以尝试通过上下文查找来获取您的服务,如下所示:

    InitialContext context = new InitialContext();
    context.lookup("java:comp/env/ejb/YourBean");
    
  • 您也可以尝试使用 @Stateless 注释您的过滤器。所以它由容器管理。

  • 您可以找到相关的 JIRA herehere .

    另见:
  • GlassFish 4 + JAX-RS Filter with @EJB
  • Dependency injection into ResourceFilter not working?
  • How to inject EJB into ResourceFilterFactory (Jersey)
  • 关于dependency-injection - 在 Jersey 过滤器中注入(inject) EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21335015/

    相关文章:

    java - 使用 'this' 关键字调用 Mockito stub 方法

    c# - .Net 中的依赖注入(inject)?

    java - jackson Jersey JSON

    c# - 使用 StructureMap 注入(inject)相同的实例

    java - 如何向所有 JAX-RS 响应添加相同的 header /cookie?

    java - Jersey JAX-RS @Suspished 注释在 GAE 标准环境中不起作用

    java - 安全地检查 EJB 是否存在或如果不存在则阻止回滚

    Java、EJB框架、RBAC

    c# - 在 ASP.NET MVC 3 中在哪里初始化 ObjectFactory?

    angular - 在哪些情况下使用 "provide"和 "useClass"可能有用?