在Jersey过滤器中注入EJB

Jér*_*eil 7 dependency-injection ejb jersey

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

这是我的问题:我无法在Jersey过滤器中注入EJB,因为它可以很好地处理资源.但是使用过滤器,服务始终保持为null

知道怎么骗它吗?谢谢

过滤代码:

@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 ) );
    }

}
Run Code Online (Sandbox Code Playgroud)

unw*_*ich 13

这或多或少是已知的问题.

JAX-RS 2.0不支持将EJB注入JAX-RS组件(提供程序,资源).

但是有一些选择可以解决这个问题.

  • 您可以尝试切换到CDI,例如将您的服务转换为@ManagedBean和使用@Inject.

  • 您可以尝试通过上下文查找来获取服务,如下所示:

    InitialContext context = new InitialContext();
    context.lookup("java:comp/env/ejb/YourBean");
    
    Run Code Online (Sandbox Code Playgroud)
  • 您还可以尝试对过滤器进行注释,@Stateless使其由容器管理.

你可以在这里和这里找到相关的JIRA .

也可以看看: