JSON字段在Spring Boot中描述为小写



我有一个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中注册它,如下所示:-

<<p>StringDeserializer类/strong>
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将所有字符串反序列化为小写并修剪。

最新更新