Spring Boot 输入无效数据类型时,Sping Boot 请求正文验证添加自定义消息

cczfrluj  于 2023-02-12  发布在  Spring
关注(0)|答案(3)|浏览(130)

我正在使用Spring Boot创建一个POST请求,我需要根据用户输入验证请求主体。然而,当用户输入无效数据类型时,响应什么也不显示,只显示400 bad request状态。我可以添加一条消息来告诉用户哪个字段是无效数据类型吗?
例如:这是我的控制器:

@RestController
@RequestMapping("/api/foo")
public class FooController {

  @PostMapping("/save")
  public void postFoo(@Valid @RequestBody Foo foo) {
    // do somethings
  }
}

这是我的Foo类:

public class Foo {
  @NotBlank
  private String name;
  private Integer age;

  // getter/setter
}

所以现在我发布一个请求如下:

{
  "name": "Foo Name",
  "age": "A String"
}

服务器将以状态400 Bad request响应,但没有任何消息。如何放置Age must be an integer之类的消息?
到目前为止,我只有一个将Age更改为String并添加@Pattern验证注解的解决方案。

public class Foo {
  @NotBlank
  private String name;
  @Pattern(regexp = "[0-9]*", message = "Age must be an intege")
  private String age;

  // getter/setter
}
zrfyljdw

zrfyljdw1#

您需要实现错误处理机制。
在你的错误处理程序中,你需要捕获所有的异常并返回错误响应。下面是一个基于控制器级ExceptionHandling的例子

public class FooController{

   //...
   @ResponseStatus(value=HttpStatus.BAD_REQUEST)
   @ExceptionHandler({ CustomException1.class, CustomException2.class })
      public ErrorResponse handleException() {
      //
   }
}

在ErrorResponse模型中,您可以根据异常设置错误代码和消息,并通过ResponseStatus分配http错误代码
然而,这他的方法有一个主要的缺点:带@ExceptionHandler注解的方法只对特定的Controller有效,而不是对整个应用程序全局有效。
要全局处理异常,您可以使用ControllerAdvice。Here是一篇介绍总体错误处理机制的好文章

qco9c6ql

qco9c6ql2#

谢谢大家。我找到了一种方法来添加消息并响应用户,可以通过使用ControllerAdvice并重写handleHttpMessageNotReadable方法来意识到错误,如下所示:

@ControllerAdvice
public class ErrorHandlerConfig extends ResponseEntityExceptionHandler {
 @Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers,
                                                              HttpStatus status, WebRequest request) {
    if (ex.getCause() instanceof InvalidFormatException) {
        InvalidFormatException iex = (InvalidFormatException) ex.getCause();
        List<Map<String, String>> errors = new ArrayList<>();
        iex.getPath().forEach(reference -> {
            Map<String, String> error = new HashMap<>();
            error.put(reference.getFieldName(), iex.getOriginalMessage());
            errors.add(error);
        });

        return handleExceptionInternal(ex, errors, new HttpHeaders(), apiError.getStatus(), request);
    }
    return super.handleHttpMessageNotReadable(ex, headers, status, request);
}
}

响应将是:

[
    {
        "testId": "Cannot deserialize value of type `java.lang.Long` from String \"accm\": not a valid Long value"
    }
]
l7mqbcuq

l7mqbcuq3#

在post方法签名中,您可以使用Response Entity类来显示一些要返回给用户的异常消息,沿着一些状态代码。
public class FooController{
public ResponseEntity<?> showError()
{
return new ResponseEntity<>("Exception arised", HttpStatus.BAD_REQUEST);
}
}

相关问题