我正在尝试比较两个相同的对象。当页面首次加载时,它们是相等的,但是当我第二次刷新页面时,尽管数据或对象没有改变,但它们并不相等。
我在做什么。
我有一个 CurrentUser
对象,在登录时将其存储在用户 session 中。我使用 currentUser
与表单的 signedUser
进行比较。如果 currentUser.equals(pr.getAssignedUser())
则我启用访问。 AssignedUser
是对 CurrentUser
的 Hibernate 变量引用。如果我从 equals 覆盖中删除 getClass() != obj.getClass
并仅使用属性比较,则一切正常。
我最关心的是它在第一次访问时有效,但在页面刷新时无效。在不知道发生了什么的情况下,我担心内存泄漏。
有人知道这里会发生什么吗?
CurrentUserServiceImpl.class
@Scope(ScopeConstants.PERTHREAD)
public class CurrentUserServiceImpl implements CurrentUserServiceService {
private final CrudDAO crudDAO;
private CurrentUser currentUser;
public CurrentUserServiceImpl(CrudDAO crudDAO) {
this.crudDAO = crudDAO;
}
public Long getUserId() {
return getUser().getId();
}
public CurrentUser getCurrentUser() {
if (this.isUserExist() && applicationUser == null) {
PersonProfile personProfile = (PersonProfile) SecurityUtils.getSubject().getPrincipal();
currentUser = crudDAO.find(personProfile.getUid());
}
return currentUser;
}
public boolean isUserExist() {
return SecurityUtils.getSubject().getPrincipal() != null;
}
}
PurchaseRequisition.class
public PurchaseRequisition {
@Inject
private CurrentUserService currentUserService;
@Inject
private CrudDAO crudDAO;
void setupRender() {
CurrentUser currentUser = currentUserService.getCurrentUser();
PurchaseReq pr = crudDAO.find(PurchaseReq.class, id);
if(currentUser.equals(pr.getAssignedUser()) {
System.out.println("equal");
}
}
}
最佳答案
Hibernate 使用 CGLib 或 javassist 创建代理类。因此 getClass()
无法工作。请改用 instanceof
。
这个答案有一个替代解决方案:https://stackoverflow.com/a/1139992/342852
关于java - 什么会导致 getClass() != obj.getClass() 在相同对象上不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20802158/