我使用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
}
谢谢大家。我找到了一种添加消息和响应用户可以意识到错误的方法,方法是使用ControllerAdvice
并重写handleHttpMessageNotReadable
method,如下所示:
@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"
}
]
您需要实现错误处理机制。
在错误处理程序中,您需要捕获所有异常并返回错误响应。下面是基于控制器级异常处理的示例
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验证器,但不知何故,它不起作用。即使我为查询参数传递任何随机值,也不会验证并引发错误。