java - RESTful Web 服务返回太多结果且顺序不正确

标签 java web-services rest annotations jersey

我正在使用 Jersey 提供 RESTful Web 服务。我使用 javax.xml.bind.annotation 来设置 POJO 数据传输对象。我的 DTO 包含一些其他 POJO,它们为主 DTO 提供值。我能够从浏览器中的资源中获取 JSON,万岁,但是 JSON 返回了更多对象的成员变量,而且顺序错误。

这是资源:

@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;
    }
}

这是 Merchant 类:

@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: "dev-catchall@blah.com",
        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: "dev-mexp-catchall@pronto.com",
                    merchantid: 92
                },
                merchantId: 92
            }
        },
        merchant: {
            merchantNexusesByMerchantid: [
                {merchantid: 92, statecode: "CA"},
                ...,
                {merchantid: 92, statecode: "WA"}
            ],
            merchantProfile: {
                email: "dev-mexp-catchall@pronto.com",
                merchantid: 92
            }, 
            merchantid: 92
        }, 
        merchantProfile: {
            email: "dev-mexp-catchall@pronto.com", 
            merchantid: 92
        }
    }
}

最佳答案

您可以使用@XmlTransient 来忽略某些属性。在 MerchantProfileDTO 类中,在属性merchantProfile和merchant中设置@XmlTransient

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

关于java - RESTful Web 服务返回太多结果且顺序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12941986/

相关文章:

java - 为 Android 应用程序加密文件夹?

json - 如何在 Moodle 中为嵌套 Web 服务创建正确的返回函数

java - 如何从 Android 调用 RESTful Web 服务?

java - 部分项目不在 Tomcat 6 上运行

rest - 具有多个参数的 MVC4 Web API Rest 接口(interface)

java - 带有未装饰框架的 swing javafx 应用程序

java - Spring MVC 无法处理来自资源处理程序的 404?

java - 更改动态数据列表显示的宽度

休息 : return 'method not allowed' or not do the method?

json - 具有未知 key 的 JSON 序列化