我有一个Spring Boot Controller
-
@RestController
public class UserController {
@PostMapping
@ResponseStatus(CREATED)
public UserResponse register( @Valid @RequestBody UserRequest userRequest) {
//return ....
}
}
下面是UserRequest.java
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserRequest {
private String email;
//other property
}
我在请求体中发送以下json -
{
"email" : "TEST@Example.com",
//some other fields.
}
有时客户端发送email
在大写或驼峰的情况下,所以在userRquest
我想改变email
字段的值小写像test@example.com
,同时反序列化到UserRequest
对象。
有什么简单的方法来做这件事吗?我可以像@ToLowerCase
一样介绍我自己的annotation
吗?我如何创建我自己的注释并在UserRequest
的字段级别使用它。
仅仅通过引入新的注释@ToLowerCase
是不容易的,因为你还需要实现一些注释处理器做真正的转换工作。
但是你可以用一种稍微不同的方式来实现你的目标。在UserRequest
类中注释email
属性设置@JsonDeserialize
,并指定converter
。
@JsonDeserialize(converter = ToLowerCaseConverter.class)
private String email;
你需要自己实现转换器类,但是通过从StdConverter
扩展它很容易。
public class ToLowerCaseConverter extends StdConverter<String, String> {
@Override
public String convert(String value) {
return value.toLowerCase();
}
}
Jackson将在你的类中使用setter方法。在setter中执行到小写的转换。
例如
public void setEmail(final String newValue)
{
email = StringUtils.lowerCase(newValue);
}
StringUtils
是apache commons类。
您可以创建一个通用的StringDeserializer
并在ObjectMapper
中注册它,如下所示:-
public final class StringDeserializer extends StdDeserializer<String> {
public StringDeserializer() {
super((Class<String>) null);
}
@Override
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException {
JsonToken token = parser.getCurrentToken();
if (token == JsonToken.VALUE_STRING) {
String text = parser.getText();
return text == null ? null : text.toLowerCase().trim();
}
return null;
}
}
<<p>JacksonConfiguration类/strong>@Configuration
public class JacksonConfiguration {
@Autowired
void mapper(ObjectMapper mapper) {
mapper.registerModule(initModule());
}
private Module initModule() {
SimpleModule module = new SimpleModule();
module.addDeserializer(String.class, new StringDeserializer());
return module;
}
}
上面的代码使jackson将所有字符串反序列化为小写并修剪。