我已经在我的DTO中添加了这样的验证:
@AssertTrue(message = "validation.amountNot0RateAbove1" )
public boolean isAmountNot0RateAbove1() {
return amount == 0 ? true : rate != null && rate > 1;
}
这会产生如下错误:
Resolved exception caused by Handler execution: org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument at index 0 in method: public org.springframework.http.ResponseEntity<nl.tibi.sbys.service.dto.ProjectDTO> nl.tibi.sbys.web.rest.client.ClientProjectResource.updateProject(nl.tibi.sbys.service.dto.ProjectDTO) throws java.net.URISyntaxException, with 1 error(s): [Field error in object 'projectDTO' on field 'position[0].amountNot0RateAbove1': rejected value [false]; codes [AssertTrue.projectDTO.position[0].amountNot0RateAbove1,AssertTrue.projectDTO.position.amountNot0RateAbove1,AssertTrue.position[0].amountNot0RateAbove1,AssertTrue.position.amountNot0RateAbove1,AssertTrue.amountNot0RateAbove1,AssertTrue.boolean,AssertTrue]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [projectDTO.position[0].amountNot0RateAbove1,position[0].amountNot0RateAbove1]; arguments []; default message [position[0].amountNot0RateAbove1]]; default message [validation.amountNot0RateAbove1]]
响应是(类型httpErrorResponse):
error:
fieldErrors:
Array(1)0:
field:"position[0].amountNot0RateAbove1"
message:"AssertTrue"
objectName:"projectDTO"
jhi-alert-error显示此消息:
translation-not-found[error.AssertTrue]
我想要显示的是自定义错误消息,因此使用amountNot0RateAbove1键。
不知何故,java代码中的错误不会发送到前端,只会发送最后一个密钥AssertTrue
。
怎么应该改变呢?
我认为最好将java代码中的第一个错误作为消息而不是最后一个发送。所以AssertTrue.projectDTO.position[0].amountNot0RateAbove1
代替甚至更好地采用默认消息,如果设置了来自注释的消息:
@AssertTrue(message = "validation.amountNot0RateAbove1" )
任何帮助?
作为一个不那么好的解决方法我试图编辑响应设置消息在这一行:
private onSaveError(res: HttpErrorResponse) {
console.log('res:', res);
res.error.fieldErrors[0].message = 'validation.amountNot0RateAbove1';
console.log('res:', res);
this.isSaving = false;
}
但是虽然执行了代码但它并没有改变消息。
这个,src/main/webapp/app/shared/alert/alert-error.component.ts
组件发出错误消息。除非有人有更好的解决方案,否则我可以在那里做点什么:)
我认为ExceptionTranslator是改进返回的错误消息的地方。
===========================编辑=================== =======
这里可以改变。不确定其他错误会产生什么影响:
@Override
public ResponseEntity<Problem> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) {
BindingResult result = ex.getBindingResult();
List<FieldErrorVM> fieldErrors = result.getFieldErrors().stream()
.map(f -> new FieldErrorVM(f.getObjectName(), f.getField(), f.getCode()))
.collect(Collectors.toList());
f.getCode()
将返回列表中最常用的代码。第一个是最具体的。
seconde在AssertTrue
注释中设置的消息可以在f.getDefaultMessage()中找到
不确定我是否应该使用第一个代码或默认消息
答案 0 :(得分:0)
我仍然希望有人有更好的解决方案,但这就是我所做的。此代码将保留默认的工作方式,即使用getCode从fielderror获取最常用的消息。但在极少数情况下,您可以用这种方式覆盖它:
ExceptionTranslator
public static final String USE_MESSAGE_AS_KEY = "USE_MESSAGE_AS_KEY:";
@Override
public ResponseEntity<Problem> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) {
BindingResult result = ex.getBindingResult();
List<FieldErrorVM> fieldErrors = new ArrayList<>();
for (FieldError fieldError : result.getFieldErrors()) {
String errorCode = null;
if (StringUtils.startsWith(fieldError.getDefaultMessage(), USE_MESSAGE_AS_KEY)) {
errorCode = StringUtils.removeStart(fieldError.getDefaultMessage(), USE_MESSAGE_AS_KEY);
}else {
errorCode = fieldError.getCode();
}
fieldErrors.add(new FieldErrorVM(fieldError.getObjectName(), fieldError.getField(), errorCode));
}
Problem problem = Problem.builder()
.withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE)
.withTitle("Method argument not valid")
.withStatus(defaultConstraintViolationStatus())
.with("message", ErrorConstants.ERR_VALIDATION)
.with("fieldErrors", fieldErrors)
.build();
return create(ex, problem, request);
}
在DTO中,您现在可以添加:
@AssertTrue(message = USE_MESSAGE_AS_KEY + "amountNot0RateAbove1")
public boolean isRate() {
return amount == 0 ? true : rate != null && rate > 0;
}
它将使用消息amountNot0RateAbove1
(前缀为错误。)作为键,将frontent转换为一个很好的错误消息。