我正在尝试编写一个实用程序方法来帮助我为我的应用程序中的bean验证建立异常消息以解决任何验证错误。当我去验证我的对象(在这种情况下,BasicContactInformation)时,我按如下方式进行:
Set<ConstraintViolation<BasicContactInformation>> constraintViolations = validator.validate(basicContactInformation);
if(!CollectionUtils.isEmpty(constraintViolations)){
throw new CustomerAccountException(LoggingUtils.getLoggingOutput("Unable to update customer contact information", constraintViolations));
}
我正在为其他bean做同样的事情。该实用程序方法将获取异常消息的前缀以及约束验证集,并将构建格式良好的输出消息。问题是,我无法弄清楚如何构建消息,以便它可以接受任何类型的一组约束违规。我尝试了以下内容,但它似乎没有效果,因为它说不能投射:
public static String getLoggingOutput(String prefix, Set<ConstraintViolation<?>> violations){
StringBuilder outputBuilder = new StringBuilder(prefix);
if(!CollectionUtils.isEmpty(violations)){
for(ConstraintViolation<?> currentViolation: violations){
outputBuilder.append("[");
outputBuilder.append(currentViolation.getMessage());
outputBuilder.append("]");
}
}
return outputBuilder.toString();
}
这是编译器错误
The method getLoggingOutput(String, Set<ConstraintViolation<?>>) in the type LoggingUtils is not applicable for the arguments (String, Set<ConstraintViolation<BasicContactInformation>>)
知道方法签名应该是什么,以便它适用于任何一组约束违规?我试图避免编写一个方法,为foo接受一组约束违规,一个用于bar,一个用于baz等。
答案 0 :(得分:1)
您可以使方法通用:
public static <T> String getLoggingOutput(String prefix,
Set<ConstraintViolation<T>> violations) {
// ...
}
在大多数情况下,如果不是全部,编译器将从参数中推断出类型参数。这与使用通配符完全不同。