Java 如何验证我没有';无法同时接收@JsonProperty和@JsonAlias中定义的值?
我将实体中的child表示为数字child\u entity\u id。但有时我必须处理child\u entity\u选择器json对象,而不是child\u entity\u id。它被发送用于从数据库中通过某些值提取实体 父实体有这样的注释Java 如何验证我没有';无法同时接收@JsonProperty和@JsonAlias中定义的值?,java,json,spring-boot,jackson,deserialization,Java,Json,Spring Boot,Jackson,Deserialization,我将实体中的child表示为数字child\u entity\u id。但有时我必须处理child\u entity\u选择器json对象,而不是child\u entity\u id。它被发送用于从数据库中通过某些值提取实体 父实体有这样的注释 @Entity class Parent { @Id long id; @JsonDeserialize(using = EntityReferenceDeserializer.class) @JsonSerializ
@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"
},
}
应引发异常,因为一个json中只能同时包含“child_entity_id”或“child_entity_selector”
当我收到这样的json时,它会正确解析,但我的反序列化程序同时处理child_entity_id和child_entity_选择器,最后一个仍然保留在结果中
目前,我正在尝试获取源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);
}
}
及
是正确解析的实体
但在这两个参考文献中
{
"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\u DUPLICATE\u DETECTION
如果您还需要检查重复字段:
{
"id" : 1,
"child_entity_id": 1,
"child_entity_id": 2
}
不幸的是,它不能处理别名您可以使用父类中的
@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\u DUPLICATE\u DETECTION
如果您还需要检查重复字段:
{
"id" : 1,
"child_entity_id": 1,
"child_entity_id": 2
}
不幸的是,它不适用于别名
只有“child\u entity\u id”或“child\u entity\u id”应该在一个json中显示
很难理解您的意思mean@BSeitkazin仅将其改为“子实体id”或“子实体id”应该是在一个json中呈现的,很难理解您要表达的内容mean@BSeitkazin换言之,它在实体创建上可以按需要工作。但是,由于objectMapper.Reader导致更新操作失败,更新时出现异常“PatchUpdateException details:没有为创建者属性“child\u entity\u ref”(通过引用链:Parent[\“child\u entity\u ref\”)定义回退设置器/字段”。我没有使用更新,听起来好像忽略了@jsonaas
。您可以尝试使用两个设置器来设置子字段,一个用@JsonProperty(“child\u entity\u id”)
标记,另一个用@JsonProperty(“child\u entity\u selector”)
标记。虽然听起来有点邋遢,但它不会检测到重复。理想的方法是在反序列化时修改json,当我有原始json和实体类型时。从实体类中,我可以提取带有注释的文件并验证|修改实体是的,它可以根据需要在实体创建中工作。但是,由于objectMapper.Reader导致更新操作失败,更新时出现异常“PatchUpdateException details:没有为创建者属性“child\u entity\u ref”(通过引用链:Parent[\“child\u entity\u ref\”)定义回退设置器/字段”。我没有使用更新,听起来好像忽略了@jsonaas
。您可以尝试使用两个设置器来设置子字段,一个用@JsonProperty(“child\u entity\u id”)
标记,另一个用@JsonProperty(“child\u entity\u selector”)
标记。虽然听起来有点邋遢,但它不会检测到重复。理想的方法是在反序列化时修改json,当我有原始json和实体类型时。从实体类中,我可以提取带有注释的文件,并验证|修改实体