我正在使用Spring MVC + Hibernate组合开发一个Web应用程序。今晚我来了一个很大的“但......”:
我有两种不同类型的用户,有很多不同的属性。也就是说,我希望应用程序能够验证几种类型的用户对象。几天前我认为这不会成为一个问题,我写了一个BaseUser
实体和一个IUser
接口,所以我得到了:
RegularUser extends BaseUser implements IUser;
PremiumUser extends BaseUser implements IUser;
现在,出现了几个问题:我有interface UserService
:
public interface UserService {
public boolean authenticateUser(IUser user);
}
我应该拥有与IUser实现一样多的此接口实现吗? 当我想对用户进行身份验证时,如何在创建用户对象进行身份验证之前告知高级用户的常规用户?
我的目标是让应用程序选择正确的对象进行身份验证,因为在所有用户实现中不能有两个具有相同名称的用户。我有点困惑。
一些额外信息:
authenticate(IUser user)
方法的示例实现是:
@Service("regularUserService")
public class RegularUserServiceImpl implements UserService {
@Autowired
RegularUserDAOImpl userDAO;
@Transactional
public boolean authenticateUser(IUser user) {
if (user == null || !(user instanceof RegularUser)) {
return false;
} else {
String name = user.getName();
String pass = user.getPassword();
RegularUser existingUser = userDAO.findByName(name);
if (existingUser == null) {
return false;
} else {
if (pass.equals(existingUser.getPassword())) {
if (existingUser.getIsEnabled()) {
return true;
}
}
}
}
return false;
}
...
}
如果我有一个具有相同authenticate()方法的等效PremiumUserServiceImpl
,那么Spring将如何知道要代理哪一个(即,选择哪个UserService实现)?
提前致谢, 丹。
答案 0 :(得分:0)
如何在创建之前告知高级用户的常规用户 用户对象进行身份验证?
好的,你有
@Service("regularUserService")
public class RegularUserServiceImpl implements UserService {
.....
}
和另一个像:
@Service("premiumUserService")
public class PremiumUserServiceImpl implements UserService {
.....
}
好的,但Spring会找到UserService
的多个实现,使用@Primary
注释告诉Spring当存在多个匹配的bean实例时,哪个autowire候选者会首选。
例如,如果您想像之前一样RegularUserService
,请在其上添加@Primary
:
@Primary
@Service("regularUserService")
public class RegularUserServiceImpl implements UserService {
.....
}
<小时/> 另见: