2014-01-24 41 views
7

我目前正在開發一個使用Jersey JAX-RS作爲後端和AngularJS作爲前端的應用程序;我需要一種認證,所以每次發送一個應該由後端驗證的令牌。爲此,我決定創建一個Jersey過濾器來查找該令牌,然後調用我的AuthenticateService來檢查用戶是否可以進行身份​​驗證。 然後授權由@RolesAllowed註釋管理。在澤西島過濾器中注入EJB

這裏是我的問題:我不能注入一個EJB澤西過濾器內,strangly因爲它很好的資源。但隨着該濾波器,服務始終保持

任何想法如何欺騙它? 感謝

過濾代碼:

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

} 

回答

13

這是一個或多或少知道的問題。

JAX-RS 2.0不支持將EJB注入到JAX-RS組件 (提供程序,資源)中。

但有一些選項可以解決這個問題。

  • 您可以嘗試切換到CDI,將您的服務變爲@ManagedBean並使用@Inject

  • 您可以嘗試通過上下文查找的東西讓你的服務是這樣的:

    InitialContext context = new InitialContext(); 
    context.lookup("java:comp/env/ejb/YourBean"); 
    
  • 您也可以嘗試用@Stateless所以它得到由容器管理來註釋濾波器。

你可以找到相關的JIRA herehere

參見:

+0

用'訣竅InitialContext'解決我的問題,謝謝! –