【发布时间】:2019-01-29 13:06:06
【问题描述】:
我正在使用蛇形案例为我的 API 构建与 Spring Boot 的 json 映射。 spring 允许您在 application.properties 文件中轻松定义:
spring.jackson.property-naming-strategy=SNAKE_CASE
这很好用。但是,如果我添加验证并尝试发布无效的 json 正文,则响应消息包含骆驼案例中的缺失字段。这是我的控制器和传输对象:
import javax.validation.constraints.NotNull;
public class MyObject {
@NotNull
String camelCasedField;
public MyObject() {}
public String getCamelCasedField() {
return camelCasedField;
}
public void setCamelCasedField(String camelCasedField) {
this.camelCasedField = camelCasedField;
}
}
控制器:
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@RestController
@RequestMapping("/api/test")
public class MyController {
@PostMapping
public void createTenant(@RequestBody @Valid MyObject myObject) {}
}
如果我发布以下 json 正文,一切都很好: _ { "camel_cased_field": "测试" }
如果我发布一个空的 json 正文,我会收到预期的错误,但字段名称是驼峰式大小写而不是蛇形大小写:
{
"timestamp": "2018-08-23T07:43:18.987+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotNull.myObject.camelCasedField",
"NotNull.camelCasedField",
"NotNull.java.lang.String",
"NotNull"
],
"arguments": [
{
"codes": [
"myObject.camelCasedField",
"camelCasedField"
],
"arguments": null,
"default_message": "camelCasedField",
"code": "camelCasedField"
}
],
"default_message": "must not be null",
"object_name": "myObject",
"field": "camelCasedField", // should be camel_cased_field
"rejected_value": null,
"binding_failure": false,
"code": "NotNull"
}
],
"message": "Validation failed for object='myObject'. Error count: 1",
"path": "/api/test"
}
有没有办法为 spring 应用程序的所有端点解决这个问题?
【问题讨论】:
-
我认为是驼峰式,因为它包含 java 类的 java 文件名,而不是请求中缺少的 json 字段名...
-
是的,但这正是问题所在。它应该包含 json 字段而不是 java 字段名称。
-
那么您可能需要一个不同的错误处理程序,也许是您自己的...,但我对此一无所知...
-
错误响应是你自定义的吗?检查您的应用程序是否使用 jackson ObjectMapper 的新实例进行错误处理。还要检查你是否在使用 webflux。
标签: java spring spring-boot