AssertTrue验证在jhi-alert-error

时间:2018-03-07 14:49:39

标签: validation jhipster

我已经在我的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()中找到

不确定我是否应该使用第一个代码或默认消息

1 个答案:

答案 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转换为一个很好的错误消息。