2012-10-17 20 views
0

我使用泽西提供一个RESTful Web服务。我使用javax.xml.bind.annotation来设置我的POJO数据传输对象。我的DTO包含一些为主DTO提供值的POJO。我可以从浏览器的资源中获取JSON,但是JSON会返回更多的对象成员变量并且顺序错误。RESTful Web服务返回太多结果,而不是在正确的顺序

这里的资源:

@Controller 
@Path("/merchants/{merchantId}/profile") 
public class MerchantProfileResource { 

    @Autowired 
    private MerchantProfileManager merchantProfileManager; 

    public MerchantProfileResource() { 
    } 

    @GET 
    @Produces("application/json") 
    // TODO - wire this up 
    public MerchantProfileDTO getMerchantProfile(@PathVariable String id) { 
     MerchantProfileDTO merchantProfile = merchantProfileManager.getMerchantProfileDTO(id); 

     return merchantProfile; 
    } 

    public MerchantProfileManager getMerchantProfileManager() { 
     return merchantProfileManager; 
    } 

    public void setMerchantProfileManager(MerchantProfileManager merchantProfileManager) { 
     this.merchantProfileManager = merchantProfileManager; 
    } 
} 

这里的DTO类:

@XmlRootElement(name = "response") 
@XmlType(propOrder={"merchantId", "email", "paymentMethods", "merchantTaxData"}) 
public class MerchantProfileDTO { 

    @XmlElement(name = "merchantId") 
    private int merchantId; 

    public int getMerchantId() { 
     if (merchant == null) 
      return 0; 
     return merchant.getMerchantid(); 
    } 

    @XmlElement(name = "email") 
    private String email; 

    public String getEmail() { 
     if (merchantProfile == null) 
      return null; 
     return merchantProfile.getEmail(); 
    } 

    @XmlElementWrapper(name = "paymentMethods") 
    @XmlElement(name = "paymentMethod") 
    private List<PaymentMethod> paymentMethods; 

    public List<PaymentMethod> getPaymentMethods() { 
     return paymentMethods; 
    } 

    public void setPaymentMethods(List<PaymentMethod> paymentMethods) { 
     this.paymentMethods = paymentMethods; 
    } 

    @XmlElement(name = "merchantTaxData") 
    private MerchantTaxData merchantTaxData; 

    public MerchantTaxData getMerchantTaxData() { 
     return merchantTaxData; 
    } 

    public void setMerchantTaxData(MerchantTaxData merchantTaxData) { 
     this.merchantTaxData = merchantTaxData; 
    } 

    private MerchantProfile merchantProfile; 

    public MerchantProfile getMerchantProfile() { 
     return merchantProfile; 
    } 

    public void setMerchantProfile(MerchantProfile merchantProfile) { 
     this.merchantProfile = merchantProfile; 
    } 

    private Merchant merchant; 

    public Merchant getMerchant() { 
     return merchant; 
    } 

    public void setMerchant(Merchant merchant) { 
     this.merchant = merchant; 
    } 
} 

这里的MerchantProfile类:

@javax.persistence.Table(name = "merchant_profile", schema = "", catalog = "mexp") 
@Entity 
public class MerchantProfile { 

    private int merchantid; 

    @javax.persistence.Column(name = "merchantid", nullable = false, insertable = true, updatable = true, length = 22, precision = 0) 
    @Id 
    public int getMerchantid() { 
     return merchantid; 
    } 

    public void setMerchantid(int merchantid) { 
     this.merchantid = merchantid; 
    } 

    private String email; 

    @javax.persistence.Column(name = "email", nullable = true, insertable = true, updatable = true, length = 255, precision = 0) 
    @Basic 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 

这里的商人阶层:

@javax.persistence.Table(name = "merchant", schema = "", catalog = "mexp") 
@Entity 
public class Merchant { 

    private int merchantid; 

    @javax.persistence.Column(name = "merchantid", nullable = false, insertable = true, updatable = true, length = 22, precision = 0) 
    @javax.persistence.Id 
    public int getMerchantid() { 
     return merchantid; 
    } 

    public void setMerchantid(int merchantid) { 
     this.merchantid = merchantid; 
    } 

    private MerchantProfile merchantProfile; 

    @OneToOne 
    @JoinColumn(name = "merchantid", unique = true, nullable = false, updatable = true) 
    public MerchantProfile getMerchantProfile() { 
     return merchantProfile; 
    } 

    public void setMerchantProfile(MerchantProfile merchantProfile) { 
     this.merchantProfile = merchantProfile; 
    } 

    private Collection<MerchantNexus> merchantNexusesByMerchantid; 

    @javax.persistence.OneToMany(orphanRemoval = true) 
    @JoinColumn(name="merchantid") 
    public Collection<MerchantNexus> getMerchantNexusesByMerchantid() { 
     return merchantNexusesByMerchantid; 
    } 

    public void setMerchantNexusesByMerchantid(Collection<MerchantNexus> merchantNexusesByMerchantid) { 
     this.merchantNexusesByMerchantid = merchantNexusesByMerchantid; 
    } 
} 

而且MerchantTaxData类:

@XmlRootElement(name = "merchantTaxData") 
@XmlType(propOrder={"isTaxInfoKnown", "nexusList"}) 
public class MerchantTaxData { 

    public MerchantTaxData() { 
    } 

    @XmlElement(name = "isTaxInfoKnown") 
    private boolean isTaxInfoKnown; 

    public boolean isTaxInfoKnown() { 
     if (merchant == null) 
      return false; 
     return (1 == merchant.getIstaxinfoknown()); 
    } 

    @XmlElementWrapper(name = "nexusList") 
    @XmlElement(name = "nexus") 
    private List<MerchantNexus> nexusList; 

    public List<MerchantNexus> getNexusList() { 
     return nexusList; 
    } 

    public void setNexusList(List<MerchantNexus> nexusList) { 
     this.nexusList = nexusList; 
    } 

    private Merchant merchant; 

    public Merchant getMerchant() { 
     return merchant; 
    } 

    public void setMerchant(Merchant merchant) { 
     this.merchant = merchant; 
    } 
} 

我希望得到的回复是

{ 
    response: { 
     merchantId: 92, 
     email: "[email protected]", 
     paymentMethods: [ 
      {paymentMethod: pm1}, 
      ..., 
      {paymentMethod: pmN} 
     ], 
     merchantTaxData: { 
      isTaxInfoKnown: true, 
      nexusList: { 
       nexus: [ 
        {merchantid: 92,statecode: "CA"}, 
        ..., 
        {merchantid: 92,statecode: "WA"} 
       ] 
      } 
     } 
    } 
} 

但我得到的回复是远远不止这些:

{ 
response: { 
     merchantId: 0, 
     merchantTaxData: { 
      isTaxInfoKnown: true, 
      nexusList: { 
       nexus: [ 
        {merchantid: 92, statecode: "CA"}, 
        ..., 
        {merchantid: 92, statecode: "WA"} 
       ] 
      }, 
      merchant: { 
       merchantNexusesByMerchantid: [ 
        {merchantid: 92, statecode: "CA"}, 
        ..., 
        {merchantid: 92, statecode: "WA"} 
       ], 
       merchantProfile: { 
        email: "[email protected]", 
        merchantid: 92 
       }, 
       merchantId: 92 
      } 
     }, 
     merchant: { 
      merchantNexusesByMerchantid: [ 
       {merchantid: 92, statecode: "CA"}, 
       ..., 
       {merchantid: 92, statecode: "WA"} 
      ], 
      merchantProfile: { 
       email: "[email protected]", 
       merchantid: 92 
      }, 
      merchantid: 92 
     }, 
     merchantProfile: { 
      email: "[email protected]", 
      merchantid: 92 
     } 
    } 
} 
+2

不知道这将使任何区别,但尝试添加@XmlAccessorType(XmlAccessType.NONE)到您的DTO(并可能付款方法类)。 –

+1

@SamiKorhonen对'@ XmlAccessorType'说得对。它默认使用公共getter和setter的字段。至于排序,你可以尝试[@XmlType(http://docs.oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlType.html),并指定'propOrder'。 – condit

+0

我在上面显示的'MerchantProfileDTO'代码中没有正确指定'propOrder'? – barclay

回答

0

我应该在干将,不是变量前面有我的注释。

除此之外,@SamiKorhonen或@ user463324在使用@XmlAccessorType(XmlAccessType.NONE)的评论中是正确的。我邀请他们提出问题的真实答案,但从未做过。

我不想从社区获得悲痛不接受回答我的问题。

1

你可以使用@XmlTransient来忽略某些属性。在你MerchantProfileDTO类,物业merchantProfile设置@XmlTransient和商人

@XmlTransient 
private MerchantProfile merchantProfile; 
@XmlTransient 
private Merchant merchant;