我使用泽西提供一个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
}
}
}
不知道这将使任何区别,但尝试添加@XmlAccessorType(XmlAccessType.NONE)到您的DTO(并可能付款方法类)。 –
@SamiKorhonen对'@ XmlAccessorType'说得对。它默认使用公共getter和setter的字段。至于排序,你可以尝试[@XmlType(http://docs.oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlType.html),并指定'propOrder'。 – condit
我在上面显示的'MerchantProfileDTO'代码中没有正确指定'propOrder'? – barclay