微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jackson XML 反序列化,InvalidDefinitionException:属性“time”的 getter 定义冲突

如何解决Jackson XML 反序列化,InvalidDefinitionException:属性“time”的 getter 定义冲突

我有一个这样的 DTO:

strings.Join(String Slice,{ something to separate,you can let this as ""
package ...;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.*;
import lombok.experimental.FieldDefaults;

import java.time.LocalDateTime;
import java.util.List;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@JacksonXmlRootElement(localName = "root")
public class RootDto {
    @JsonInclude(value = JsonInclude.Include.NON_NULL)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    LocalDateTime time;

    @JsonInclude(value = JsonInclude.Include.NON_NULL)
    @JacksonXmlElementWrapper(localName = "times")
    @JacksonXmlProperty(localName = "time")
    List<InternalTimeDto> times;

    ...
}

据我所知,问题在于 package ...; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import lombok.*; import lombok.experimental.FieldDefaults; import java.time.LocalDateTime; @Getter @Setter @Builder @ToString @NoArgsConstructor @AllArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE) public class InternalTimeDto { @JacksonXmlProperty(isAttribute = true) Long id; @JsonFormat(pattern = "yyyy-MM-dd HH:mm") LocalDateTime time; } 字段和 time 字段的元素具有相同的名称。有没有办法在不将 times 重命名为其他名称的情况下解决冲突?理论上应该没有冲突,因为time字段和列表项在不同的级别。
XML 示例:

time

我找到了几个答案,但是当两个同名的不同对象位于同一级别时,它们解决了问题。

JSON 也被使用:

<root>
    <time>2020-11-18 12:34</time>
    <times>
        <time id="5">2020-11-18 10:00</time>
        <time id="6">2020-11-17 15:30</time>
    </times>

    ...
</root>

解决方法

解决由于多个定义的属性 time 保留您的 xml 格式而导致的擦除冲突的一种方法是创建一个 Times 类包装您的 List<InternalTimeDto> 次:

public class Times {
    @JacksonXmlProperty(localName = "time")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<InternalTimeDto> times;   
}

所以你的 RootDto 类可以这样重写:

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
@FieldDefaults(level = AccessLevel.PRIVATE)
@JacksonXmlRootElement(localName = "root")
public class RootDto {
    @JsonInclude(value = JsonInclude.Include.NON_NULL)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    LocalDateTime time;

    @JsonInclude(value = JsonInclude.Include.NON_NULL)
    private Times times; //<-- times field instead of List<InternalTimeDto> times 
}

您的 InternalTimeDto 类需要 JacksonXmlText 字段的 time 注释:

@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class InternalTimeDto {
    @JacksonXmlProperty(isAttribute = true)
    Long id;

    @JacksonXmlText
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    LocalDateTime time;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。