【发布时间】:2014-11-03 16:13:15
【问题描述】:
我正在我的 Spring 应用程序的服务层中创建一个类。
一种方法是:
/**
* Creates a new user account.
* @return Returns true if the password reset went ok, otherwise false.
*/
boolean confirmPasswordReset(UserAccount account, String confirmationId, String newPassword);
但是,此方法签名无法向调用者提供任何可能导致确认失败的信息。我有验证规则;密码不能是用户名,密码必须有8个字符等等。如果用户未能提供强密码,我想拒绝确认并返回 false。不过我也想传达验证错误。
所以我有以下解决方案,但我不确定这是否是一个好主意。这是我的尝试:
(我使用 Java 8,因此使用 Optional 类)
public class OperationResult<T> {
private Optional<T> returnObject;
private List<ConstraintViolation> violations;
public OperationResult(Optional<T> returnObject, List<ConstraintViolation> violations) {
this.returnObject = returnObject;
this.violations = violations;
}
public Optional<T> getReturnObject() {
return returnObject;
}
public List<ConstraintViolation> getViolations() {
return violations;
}
}
那我把服务层方法的返回值改成:
OperationResult<Boolean> confirmPasswordReset(UserAccount account, String confirmationId, String newPassword);
这只是一个例子,但我有几种方法会很有用。
从设计的角度来看,这看起来很糟糕吗?由于密码太弱,或者密码与用户名相同而引发异常似乎不是一个好的解决方案。
【问题讨论】:
-
如果密码太短并且与用户名相同,那么您希望向用户显示两个验证错误还是只显示其中一个?
-
两个错误,我想向调用者提供错误信息。
-
还要注意 Optional 不可序列化...
-
这是在 JSF webapp 中吗?理想情况下,该操作不应在提醒用户之前调用
confirmPasswordReset; Web 层组件(验证器等)应该防止这种情况发生
标签: java spring jakarta-ee