现象
后端定义了一个 Boolean 类型的字段,前端给这个字段传值 123,后端竟然可以接受成功(接受到的是 true)
代码跟踪
解决
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
/**
* NumberDeserializers.BooleanDeserializer
*
* @author lijian@jovision.com
* @date 2020/12/3
**/
public class BooleanDeserializer extends JsonDeserializer<Boolean> {
final protected Class<?> _valueClass = Boolean.class;
@Override
public Boolean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
return _parseBooleanPrimitive2(jp, ctxt);
}
protected final boolean _parseBooleanPrimitive2(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonToken t = jp.getCurrentToken();
if (t == JsonToken.VALUE_TRUE) {
return true;
}
if (t == JsonToken.VALUE_FALSE) {
return false;
}
if (t == JsonToken.VALUE_STRING) {
String text = jp.getText().trim();
if ("true".equals(text)) {
return true;
}
if ("false".equals(text) || text.length() == 0) {
return Boolean.FALSE;
}
}
throw ctxt.mappingException(_valueClass);
}
}
@NotNull(message = "alarmSoundEnable must not null")
@JsonDeserialize(contentUsing = BooleanDeserializer.class)
private Boolean alarmSoundEnable;