Spring数据Rest中带有手动验证的响应错误格式

Spring数据Rest中带有手动验证的响应错误格式,spring,spring-data-rest,Spring,Spring Data Rest,当使用时,当出现约束冲突时,我会得到如下响应: { "errors": [ { "entity": "Empresa", "property": "observacao", "invalidValue": "", "message": "O tamanho do campo deve ser entre 1 e 255" } ] } 但是我正在尝试手动

当使用时,当出现约束冲突时,我会得到如下响应:

{
    "errors": [
        {
            "entity": "Empresa",
            "property": "observacao",
            "invalidValue": "",
            "message": "O tamanho do campo deve ser entre 1 e 255"
        }
    ]
}
但是我正在尝试手动验证一个对象,我希望以SpringDataREST使用的相同格式返回验证错误

  @DeleteMapping("/departamento/{id}")
  public @ResponseBody
  ResponseEntity<?> filtro(@PathVariable Long id){

    Optional<Departamento> departamentoOpt = this.departamentoRepository.findById(id);

    if (!departamentoOpt.isPresent()) {
      return ResponseEntity.notFound().build();
    }

    Departamento departamento = departamentoOpt.get();

    BindingResult errors = new BeanPropertyBindingResult(
        departamento, "departamento");

    this.validator.validate(departamento, errors, PreDeleteValidation.class);

    if (errors.hasErrors()) {
      // How to return a response in the same format used by SDR here?
    }

    return ResponseEntity.ok().build();

  }
@DeleteMapping(“/departmento/{id}”)
公共@ResponseBody
ResponseEntity过滤器(@PathVariable Long id){
可选departmentoopt=this.departmentoreposition.findById(id);
如果(!departmentoopt.isPresent()){
返回ResponseEntity.notFound().build();
}
departmento departmento=departmentoopt.get();
BindingResult错误=新BeanPropertyBindingResult(
departamento(“departamento”);
this.validator.validate(departmento、errors、predeletevidation.class);
if(errors.hasErrors()){
//如何以SDR在此使用的相同格式返回响应?
}
返回ResponseEntity.ok().build();
}

如何实现这一点?

您可以在验证失败时抛出和异常,并注册一个Spring MVC控制器建议,以捕获并将其转换为满足您需要的内容

if (errors.hasErrors()) {
  throw new org.springframework.web.bind.MethodArgumentNotValidException(
                 departamento, bindingResult)
}
建议可以如下所示:

@ControllerAdvice
public class ErrorHandlingAdvice
{
  @ExceptionHandler(MethodArgumentNotValidException.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ResponseBody
  public ValidationError processValidationError(MethodArgumentNotValidException ex)
  {
    ValidationError error = new ValidationError();
    BindingResult result = ex.getBindingResult();
    List<FieldError> fieldErrors = result.getFieldErrors();

    for (FieldError fieldError : fieldErrors)
    {
      error.addError(fieldError.getField(), fieldError.getDefaultMessage());
    }

    return error;
  }
}
@ControllerAdvice
公共类错误处理建议
{
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_请求)
@应答器
公共验证错误进程验证错误(MethodArgumentNotValidException ex)
{
ValidationError error=新的ValidationError();
BindingResult=ex.getBindingResult();
List fieldErrors=result.getFieldErrors();
用于(FieldError FieldError:fieldErrors)
{
error.addError(fieldError.getField(),fieldError.getDefaultMessage());
}
返回误差;
}
}
ValidationError只是一个简单的bean:

public class ValidationError
{
  private final Map<String, List<String>> errors;

  public ValidationError()
  {
    errors = new TreeMap<>();
  }

  public void addError(String field, String error)
  {
    if (!errors.containsKey(field))
    {
      errors.put(field, new ArrayList<String>());
    }

    errors.get(field).add(error);
  }

  public Map<String, List<String>> getErrors()
  {
    return errors;
  }
}
公共类验证错误
{
私人最终地图错误;
公共验证错误()
{
错误=新树映射();
}
公共无效加法器(字符串字段,字符串错误)
{
如果(!errors.containsKey(字段))
{
errors.put(字段,new ArrayList());
}
错误。获取(字段)。添加(错误);
}
公共映射getErrors()
{
返回错误;
}
}

谢谢!这就是我最终要做的。我只是认为有一种方法可以使用SpringDataREST已有的功能,而不是实现我自己的验证错误类。