我有一个RESTful Spring Boot API,它有一个注册端点。
在我的@RestController
类中,我编写了一个简单的字符串值预处理器,用于修剪和替换仅具有null
值的空白字符串。
@InitBinder
public void blankStringBinder(WebDataBinder dataBinder) {
dataBinder.setDisallowedFields("password", "confirmPassword");
StringTrimmerEditor stringTrimmerEditor = new StringTrimmerEditor(true);
dataBinder.registerCustomEditor(String.class, stringTrimmerEditor);
}
但是当我将Postman的数据作为原始JSON
提交时,修剪编辑没有进行。我在blankStringBinder
方法中设置了一个断点,我发现每次传入的请求都会调用它。
WebDataBinder
似乎适用于form-data
。有没有办法让它适用于原始的JSON
数据?
答案 0 :(得分:3)
创建自定义JsonDeserializer:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
public class EmptyToNullCustomDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
JsonNode node = jp.readValueAsTree();
if (node.asText().isEmpty()) {
return null;
}
return node.toString();
}
}
在POJO的每个String上添加此注释:@JsonDeserialize(using = EmptyToNullCustomDeserializer.class)
。
例如:
@JsonDeserialize(using = EmptyToNullCustomDeserializer.class)
private String content;
<小时/> 修改:
如果你有很多字符串,那就太麻烦了。
为了概括所有字符串,你必须修改EmptyToNullCustomDeserializer:
@Component
public class EmptyToNullCustomDeserializer extends StdDeserializer<String> {
protected EmptyToNullCustomDeserializer() {
super(String.class);
}
@Override
public String deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
JsonNode node = jp.readValueAsTree();
if (node.asText().isEmpty()) {
return null;
}
return node.toString();
}
}
创建此组件:
@Component
public class JacksonConfiguration {
@Autowired
private EmptyToNullCustomDeserializer emptyToNullCustomDeserializer;
@Primary
@Bean
public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) {
customizer.customize(builder);
}
return builder;
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer addEmptyToNullStringDeserialization() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.deserializerByType(String.class, emptyToNullCustomDeserializer);
}
};
}
}