我目前正在开发一个以 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).
但是有一些选项可以解决这个问题。
@ManagedBean
并使用 @Inject
. InitialContext context = new InitialContext(); context.lookup("java:comp/env/ejb/YourBean");
@Stateless
注释您的过滤器。所以它由容器管理。 您可以找到相关的 JIRA here和 here .
另见:
关于dependency-injection - 在 Jersey 过滤器中注入(inject) EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21335015/