Java 如何验证我没有';无法同时接收@JsonProperty和@JsonAlias中定义的值?

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

我将实体中的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)
    @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和实体类型时。从实体类中,我可以提取带有注释的文件,并验证|修改实体