1

我在 JAVA 上的 REST Web 服务开发中遇到问题。

问题:我的网络服务从 SQL Server 数据库中获取数据。它包含字段数。有一个字段包含一个 XML 标记。所以我必须创建包含所有数据库字段的 XML 文件并将 XML 标记附加到它。

在这里,我可以从数据库中获取数据并构建 XML 文件,但我无法删除默认的 XML 标记名称。

如何删除默认的 XML 标记名称?我尝试过@XMLElement 选项,但从未成功。请帮忙!

电流输出:

<CardProfile>
    <cardID="1">
    <accountType>1</accountType>
    .
    .
    .   
    </card>
    <ProfileXML><Profile ID="1"><Signature>adfalfjalj/Signature></Profile></ProfileXML>
</CardProfile>

期望的输出:

<CardProfile>
    <card cardID="1">
    <accountType>1</accountType>
    .
    .
    .   
    </card>
    <Profile ID="1"><Signature>adfalfjalj/Signature></Profile>
</CardProfile>

卡片.java

package pinpad.repositoryservice;

import javax.xml.bind.annotation.*;

public class Card {
    private int CardID;
    private String CardHolderName;
    private String Track1Data; 
    private String Track2Data;
    private String Track3Data;
    private String PANNumber;
    private String ExpiryDate;
    private String CVV;
    private String Address;
    private String ZipCode;
    private String DriverID;
    private String AccountTypeCreditDebit;

    @XmlAttribute (name = "ID") 
    public int getCardID() {
        return CardID;
    }

    public void setCardID(int id) {
        this.CardID = id;
    }

    @XmlElement
    public String getCardHolderName() {
        return CardHolderName;
    }

    public void setCardHolderName(String CardHolderName) {
        this.CardHolderName = CardHolderName;
    }

    @XmlElement
    public String getTrack1Data() {
        return Track1Data;
    }

    public void setTrack1Data(String Track1Data) {
        this.Track1Data = Track1Data;
    }

    @XmlElement
    public String getTrack2Data() {
        return Track2Data;
    }

    public void setTrack2Data(String Track2Data) {
        this.Track2Data = Track2Data;
    }

    @XmlElement
    public String getTrack3Data() {
        return Track3Data;
    }

    public void setTrack3Data(String Track3Data) {
        this.Track3Data = Track3Data;
    }

    @XmlElement
    public String getPANNumber() {
        return PANNumber;
    }

    public void setPANNumber(String PANNumber) {
        this.PANNumber = PANNumber;
    }

    @XmlElement
    public String getExpiryDate() {
        return ExpiryDate;
    }

    public void setExpiryDate(String ExpiryDate) {
        this.ExpiryDate = ExpiryDate;
    }

    @XmlElement
    public String getCVV() {
        return CVV;
    }

    public void setCVV(String CVV) {
        this.CVV = CVV;
    }

    @XmlElement
    public String getAddress() {
        return Address;
    }

    public void setAddress(String Address) {
        this.Address = Address;
    }

    @XmlElement
    public String getZipCode() {
        return ZipCode;
    }

    public void setZipCode(String ZipCode) {
        this.ZipCode = ZipCode;
    }

    @XmlElement
    public String getDriverID() {
        return DriverID;
    }

    public void setDriverID(String DriverID) {
        this.DriverID = DriverID;
    }

    @XmlElement
    public String getAccountTypeCreditDebit() {
        return AccountTypeCreditDebit;
    }

    public void setAccountTypeCreditDebit(String AccountTypeCreditDebit) {
        this.AccountTypeCreditDebit = AccountTypeCreditDebit;
    }
}

CardProfile.java

package pinpad.repositoryservice;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "CardProfile")
@XmlAccessorType(XmlAccessType.FIELD)
public class CardProfile {

    @XmlElement (name = "Card")
    public Card cards = new Card();

    public String ProfileXML;

    /**
     * @return the cards
     */
    public Card getCards() {
        return cards;
    }

    /**
     * @param cards the cards to set
     */
    public void setCards(Card cards) {
        this.cards = cards;
    }

    /**
     * @return the profileXML
     */
    public String getProfileXML() {
        return ProfileXML;
    }

    /**
     * @param profileXML the profileXML to set
     */
    public void setProfileXML(String profileXML) {
        ProfileXML = profileXML;
    }
}

CardProfileRepositoryService.java

package pinpad.repositoryservice;

import javax.ws.rs.*;

/*
 * Holds Card and Profiles and exposes REST interface to answer a profile and card data 
 * based on profile ID and card ID
 */
@Path("/cardprofile")
public class CardProfileRepositoryService {

    CardProfile cardprofiles = new CardProfile();

    @GET
    @Path("/query/")
    @Produces("application/xml")
    public CardProfile getCardProfile(
                    @QueryParam("cardid") int CardID, 
                    @QueryParam("profileid") int ProfileID) {   

        DatabaseManager databaseManager = new DatabaseManager();

        databaseManager.getConfigProperties();
        databaseManager.getDataBaseConnection();
        cardprofiles = databaseManager.executeSprocGetCardProfile(CardID, ProfileID);
        databaseManager.closeDataBaseConnection();

        return cardprofiles;
    }
}

标签值完全来自数据库。所以我想删除标签名称,所以它只会是 Value.. 。

4

1 回答 1

0

这是一个应该可行的想法:您可以拥有一个实际的 Java 对象 Profile,它也具有 JAXB 注释,而不是将 XML 作为 String 保存在 CardProfile 中。然后,当您从数据库中提取配置文件字符串时,您将使用 JAXB 将其解组为配置文件对象,将该对象设置为 CardProfile.profile,然后编组整个 CardProfile。

CardProfile {
  @XmlElement
  public Card cards;

  @XmlElement
  public Profile Profile;
 }

当然,它会增加一些开销,因此如果您有高性能要求,可能并不理想,但它会起作用。一般来说,除非您的 XML 文档很大,否则编组/解组应该是相当轻量级的操作。

于 2012-11-07T15:16:34.280 回答