当前位置: 首页 > 知识库问答 >
问题:

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

危砚
2023-03-14

我使用Spring Boot创建一个POST请求,我需要根据用户输入验证请求体。但是,当用户输入无效的数据类型时,响应不显示任何内容,只显示< code>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错误请求响应,没有任何消息。我如何将我的消息,例如age必须是整数

到目前为止,我只有一个解决方案,可以将 Age 更改为字符串,并添加一个@Pattern验证批注。

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

  // getter/setter
}

共有3个答案

邰英毅
2023-03-14

在post方法签名中,您可以使用响应实体类来显示一些要返回给用户的异常消息,以及一些状态代码。

公共类FooController{

公共响应实体

{

返回新的ResponseEntity

}

}

澹台俊晖
2023-03-14

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

@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"
    }
]
施博文
2023-03-14

您需要实现错误处理机制。

在错误处理程序中,您需要捕获所有异常并返回错误响应。下面是基于控制器级异常处理的示例

public class FooController{

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

在ErrorResponse模型中,您可以根据异常设置错误代码和消息,并通过ResponseStatus分配http错误代码

然而,这种方法有一个主要缺点:@ExceptionHandler注释的方法只对特定的Controller有效,而不是对整个应用程序全局有效。

要全局处理异常,可以使用ControllerAdvice。下面是一篇关于总体错误处理机制的好文章

 类似资料:
  • 我想在用户使用Scanner输入时验证数据类型(在我的情况下是“int”)。 我在下面写了代码。 问题是,在第一个块中,若我给字符,程序终止。“如何在验证失败时保持循环运行??” 在第二个块中,如果我给出非整数,它将无限运行,并显示消息“仅输入整数值”。 从调试中,我得出结论,在不等待输入的情况下,它采用之前提供的最后一个非int值。 为什么编译器取最后一个值?? 有什么建议吗?

  • 问题内容: 我有一个带有开始和结束日期范围的Django模型。我想强制执行验证,以便没有两个记录具有重叠的日期范围。最简单的实现方式是什么,这样我就不必重复编写逻辑了? 例如,我不想在Form 和 a 以及 admin表单中重新实现此逻辑, 并且 模型被重写。 据我所知,Django在全球范围内强制执行这些类型的条件并不容易。 Googling并不是很有帮助,因为“模型验证”通常是指验证特定的模型

  • 我使用的是jboss KeyCloak1.5最终版本。我开发了与keycloak属性和我的用户企业数据库接口的自定义用户联邦提供程序。 我的需要是发送到用户登录界面自定义的错误消息,基于特定的特定错误与我的遗留用户数据库。

  • 我正在spring boot rest中对请求对象进行验证。我必须验证请求的数据类型。该请求有多个布尔值,并试图验证是否为布尔数据类型传入了字符串。我在ControllerAdvice类中处理了HttpMessageOnTreadableException,并发送了错误消息列表。但在我的回答中,只有第一个字段抛出异常。如果有线索,请帮忙。

  • 我们目前正在与社交名媛Laravel的谷歌登录应用程序。我们有一个获得许可号ex的Auth用户。264.我们做了一个函数,它返回一个包含所有二进制数的数组,这个权限号被取消了。 由于每次加载页面时调用此函数可能会有点繁重,因此我们考虑在创建Auth::user()时添加此函数一次。我们曾考虑在模型中添加一个自定义构造函数,但我们无法使其工作。 但是我们不能让它工作,在调用这个函数时没有值。 太长,

  • 我想验证我的控制器中的一个请求参数。请求参数应该来自给定值列表中的一个,如果不是,则应该抛出错误。在下面的代码中,我希望请求参数orderBy来自@Values准许中存在的值列表。 我已经编写了一个自定义bean验证器,但不知何故,它不起作用。即使我为查询参数传递任何随机值,也不会验证并引发错误。