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

时间:2021-07-28 15:14:20

标签: spring-boot spring-mvc jackson json-deserialization xml-deserialization

我有一个这样的 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>

1 个答案:

答案 0 :(得分:1)

解决由于多个定义的属性 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;
}
相关问题