- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在获取以数字形式显示的子实体child_entity_id。但有时我必须处理 child_entity_selector json 对象,而不是 child_entity_id 。发送它是为了通过数据库中的某些值提取实体。
父实体有这样的注释
@Entity
class Parent {
@Id
long id;
@JsonDeserialize(using = EntityReferenceDeserializer.class)
@JsonSerialize(using = EntityReferenceSerializer.class)
@JsonProperty("child_entity_id")
@JsonAlias("child_entity_selector")
Child child;
对于响应 json,例如
{
"id" : 1,
"child_entity_id": 1,
"child_entity_selector": {
"child_name": "I am a child"
},
}
应该抛出异常,因为只有“child_entity_id”或“child_entity_selector”必须同时出现在一个 json 中。
当我收到这样的 json 时,它会正确解析,但我的反序列化器同时处理 child_entity_id 和 child_entity_selector 并且最后一个保留在结果中。
目前,我正在尝试获取源 json 和实体,以检查 json 是否没有别名覆盖的重复引用。
我已经设置了 SimpleModule 和自定义反序列化器
@Component
public class WebConfig {
@Bean
public SimpleModule simpleModule() {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (beanDesc.getBeanClass() == Child.class)
return new ChildDeserializer(deserializer);
return deserializer;
}
});
return module;
}
}
和解串器
public class ChildDeserializer extends StdDeserializer<Child> implements ResolvableDeserializer {
private final JsonDeserializer<?> defaultDeserializer;
public ChildDeserializer(JsonDeserializer<?> defaultDeserializer) {
super(Child.class);
this.defaultDeserializer = defaultDeserializer;
}
@Override
public Child deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Child modelExecution = (Child) defaultDeserializer.deserialize(p, ctxt);
// Can not correctly read raw json after parsing -- node becomes null now after deserialization above
JsonNode node = p.getCodec().readTree(p);
boolean duplication = node.has("child_entity_id") && node.has("child_entity_selector");
if (duplication) {
throw new RuntimeException("Duplicated!")
} else {
log("Not duplicated");
}
return child;
}
@Override
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
}
}
反序列化后我无法访问 JsonNode 值。反之亦然,解析JsonNode值后无法获取反序列化的Child实体。
预期行为
{
"id" : 1,
"child_entity_id": 1,
}
和
{
"id" : 1,
"child_entity_selector": {
"child_name": "I am a child"
},
}
是正确解析的实体。
但是在两个引用文献中
{
"id" : 1,
"child_entity_id": 1,
"child_entity_selector": {
"child_name": "I am a child"
},
}
应该抛出异常。
最佳答案
您可以在父类中使用@JsonCreator
来处理它
@JsonCreator
public Parent(@JsonProperty("child_entity_id") Child childFromId, @JsonProperty("child_entity_selector") Child childFromSelector) {
if (childFromId != null && childFromSelector != null) {
throw new RuntimeException("Duplicated!");
}
this.child = (childFromSelector == null) ? childFromId : childFromSelector;
}
如果您还需要检查重复字段,则可以使用 JsonParser.Feature.STRICT_DUPLICATE_DETECTION
:
{
"id" : 1,
"child_entity_id": 1,
"child_entity_id": 2
}
不幸的是,它不适用于别名
关于java - 如何验证我没有收到 @JsonProperty 和 @JsonAlias 中定义的两个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966956/
我正在获取以数字形式显示的子实体child_entity_id。但有时我必须处理 child_entity_selector json 对象,而不是 child_entity_id 。发送它是为了通过
我是一名优秀的程序员,十分优秀!