如何解决Jackson XML 反序列化,InvalidDefinitionException:属性“time”的 getter 定义冲突
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 举报,一经查实,本站将立刻删除。