【问题标题】:Jersey JSON/JAXB Ignoring or not seeing "some" public properties in POJOJersey JSON/JAXB 忽略或看不到 POJO 中的“某些”公共属性
【发布时间】:2013-12-24 05:47:10
【问题描述】:

我有一个 POJO,我正在尝试用球衣序列化作为休息 api 响应。只有部分属性被序列化。 getter 返回的值不为空。

如果我尝试对属性进行排序,则会为“缺失”属性抛出 IllegalAnnotationExceptions,就好像它们不存在一样。

我还有其他几个 POJO 可以正常工作。我有一个没有看到任何属性的对象和一个看到 10 个属性中的 7 个的对象。

有人能告诉我发生了什么吗?并建议如何解决?

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.io.Serializable;
import java.util.Date;

@XmlType(propOrder = { "startDateTime","endDateTime","durationMinutes","remainingMinutes","percentComplete","nodesDiscovered","nodesTried",
                        "totalNodes", "discoveryCompleted","canceledFlag" })
@XmlRootElement
public class DiscoveryStatus implements Serializable {
    private Number discoveryCompleted=0;
    private Date  startDateTime = new Date();
    private Date  endDateTime  = new Date();

    private Number startMS =20;
    private Number currMS =20;

    private Number durationMinutes =AppSettings.DiscoveryNodeMulticastDurationMins;
    private Number remainingMinutes =20;

    private Boolean canceledFlag=false;
    private Number percentComplete =0;
    private Number nodesDiscovered =0;
    private Number nodesTried =0;
    private Number totalNodes =0;

    public DiscoveryStatus(){
        totalNodes =1;
    }

    // Seen
    public Date getStartDateTime(){
        return this.startDateTime;
    }

    // Seen
    public Number getDurationMinutes(){
        return this.durationMinutes;
    }

    public Number getRemainingMinutes(){
        return this.remainingMinutes;
    }

    // Seen
    public Date getEndDateTime(){
        return this.endDateTime;
    }

    public Number getDiscoveryCompleted(){
        return this.discoveryCompleted;
    }

    public Boolean getCanceledFlag(){
        return this.canceledFlag;
    }

    // Seen
    public Number getPercentComplete(){
        return this.percentComplete;
    }

    // Seen
    public Number getNodesDiscovered(){
        return this.nodesDiscovered;
    }

    // Seen
    public Number getNodesTried(){
        return this.nodesTried;
    }

    // Seen
    public Number getTotalNodes(){
        return this.totalNodes;
    }

    public Number setDiscoveryCompleted(boolean discoveryCompleted ) {
        // gm this.discoveryCompleted =discoveryCompleted;
        return this.discoveryCompleted;
    }

    public Number setPercentComplete (Number percentComplete) {
        this.percentComplete =percentComplete;
        return this.percentComplete;
    }

    public Number setNodesDiscovered(Number nodesDiscovered) {
        this.nodesDiscovered =nodesDiscovered;
        return this.nodesDiscovered;
    }

    public Number setNodesTried(Number nodesTried) {
        this.nodesTried =nodesTried;
        return this.nodesTried;
    }

    public Number setTotalNodes(Number totalNodes) {
        this.totalNodes =totalNodes;
        return this.totalNodes;
    }

    public Date setStartDateTime(Date  startDateTime) {
        this.startDateTime = startDateTime;
        return this.startDateTime;
    }

    public Date setStartDateTime() {
        this.startDateTime = new Date();
        return this.startDateTime;
    }

    public Date setEndDateTime(Date  endDateTime) {
        this.endDateTime = endDateTime;
        return this.endDateTime;
    }

    public Date setEndDateTime() {
        this.endDateTime = new Date();
        return this.endDateTime;
    }

    public Number setDurationMinutes(Number  durationMinutes) {
        this.durationMinutes = durationMinutes;
        return this.durationMinutes;
    }

    public Number setDurationMinutes() {
        this.durationMinutes = AppSettings.DiscoveryNodeMulticastDurationMins;
        return this.durationMinutes;
    }

}

【问题讨论】:

  • 您是否为所有这些字段提供了具有正确 JavaBeans 命名的 setter?
  • 我相信是这样.. 包括 getter 代码,是否需要 setter?
  • 也添加了设置器
  • 为所有的 getter 添加匹配的 setter(例如 setCanceledFlag 方法),这应该可以解决问题。否则 JAXB 不会将那些未注释的方法视为 XML 属性。

标签: java json serialization jaxb jersey


【解决方案1】:

您的模型存在问题

您的模型存在一些问题:

没有 Setter 的 Getter

默认情况下,JAXB 不会将没有相应 set 方法的 get 方法视为属性。但是,如果您使用 @XmlElement 对其进行注释,那么它会。

@XmlElement
public Number getRemainingMinutes(){
    return this.remainingMinutes;
}

@XmlElement
public Boolean getCanceledFlag(){
    return this.canceledFlag;
}

获取/设置方法不匹配

JAXB 将期望 get 方法的返回类型与 set 方法的参数类型相匹配。

public Number getDiscoveryCompleted(){
    return this.discoveryCompleted;
}

public Number setDiscoveryCompleted(boolean discoveryCompleted ) {
    // gm this.discoveryCompleted =discoveryCompleted;
    return this.discoveryCompleted;
}

解决这两个问题

您可以使用@XmlAccessorType 注释来告诉JAXB 使用字段访问,而不是使用默认属性访问。对于您的模型,这意味着使用 @XmlTransient 注释几个未映射的字段(请参阅:http://blog.bdoughan.com/2012/04/jaxb-and-unmapped-properties.html)。

import javax.xml.bind.annotation.*;

import java.io.Serializable;
import java.util.Date;

@XmlType(propOrder = { "startDateTime","endDateTime","durationMinutes","remainingMinutes","percentComplete","nodesDiscovered","nodesTried",
                        "totalNodes", "discoveryCompleted","canceledFlag" })
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class DiscoveryStatus implements Serializable {
    private Number discoveryCompleted=0;
    private Date  startDateTime = new Date();
    private Date  endDateTime  = new Date();

    @XmlTransient
    private Number startMS =20;

    @XmlTransient
    private Number currMS =20;

    private Number durationMinutes =AppSettings.DiscoveryNodeMulticastDurationMins;
    private Number remainingMinutes =20;

    private Boolean canceledFlag=false;
    private Number percentComplete =0;
    private Number nodesDiscovered =0;
    private Number nodesTried =0;
    private Number totalNodes =0;

    public DiscoveryStatus(){
        totalNodes =1;
    }

}

更多信息

【讨论】:

  • 感谢您的完整示例,太棒了!根据 Juned 的 cmets,我昨晚能够启动并运行它。您的示例更加详尽且同样正确。它也几乎与我最终所做的相同。尴尬的是,昨晚“大脑”并没有完全投入。
【解决方案2】:

您的布尔 getter 不符合所需的约定。例如:

getCanceledFlag 应该是isCanceledFlag

为避免此类问题,请尝试在您的 getter 上添加注释。这是一个例子:

 @XmlElement
public Number getRemainingMinutes(){

【讨论】:

  • 谢谢.. 注释做到了.. 我将所有布尔 isXXX() 切换为 getter,因为属性顺序注释没有拾取“isXX”。一个不会忘记的教训
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多