我在我的应用程序的 JPA/EJB 3/JSF 2/Spring Security 3 中使用 glassfish 3.1.2。我想编写一个像这样的自定义 UserdetailsService:
import org.apache.log4j.Logger;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
public class MyUserDetailsService implements UserDetailsService {
private static final Logger logger = Logger.getLogger(MyUserDetailsService.class);
@EJB
private CollaborateurFacadeLocal collaborateurFacade;
@Override
public UserDetails loadUserByUsername(String userName) {
Collaborateur collab = getUser(userName);
if (collab == null) {
throw new UsernameNotFoundException(userName + " not found");
}
User user = new User(collab);
if (user == null) {
throw new UsernameNotFoundException(userName + " not found");
}
return user;
}
}
所以我试图在我的 MyUserDetailsService 中注入一个 EJB,以便能够在我的 Spring Security 上下文文件中将它用作身份验证提供程序:“applicationContext-security.xml”,如下所示:
<authentication-manager>
<authentication-provider user-service-ref="myUserDetailsService">
</authentication-provider>
</authentication-manager>
问题是我陷入了由空协作外观引起的 NullPointerException。
我尝试了几件事,其中包括:
使用上下文查找 EJB(就像这里的那个):解决方案有效,但这不是我想要的:因为 EJB 的名称可能会被修改。
将 MyUserDetailsService 类作为 JSF 2 托管 bean,collaborateurFacade 一直保持到 null。
将 MyUserDetailsService 类作为 JSF 2 托管 bean 并具有 ApplicationScoped 范围,collaborateurFacade 直到 null。
问题:是否有任何干净的方法可以在 MyUserDetailsService 类中注入 EJB?
我知道我可以使用 @Service 注释来注释我的类(请参阅此链接),然后我将陷入我不想要的 EJB 和 Spring 的混合