JaxB unmarshal XML с тегами заглавной буквы - PullRequest
2 голосов
/ 14 сентября 2011

Я использую Sprint 3.0.5 и включенный jaxb marshaller для связи со службой REST. Служба, предоставляемая другой компанией, отправляет через POST XML в мою Службу, и мне приходится разбирать этот XML в моих объектах Java и обрабатывать их.

Проблема, с которой я столкнулся, заключается в том, что теги XML начинаются с заглавной буквы (они этого не изменят), и поэтому маршаллер JAXB не может демонтировать объект.

XML выглядит следующим образом:

<Ssm_Packet>
<Version>1</Version>
<Protocol_ID>0</Protocol_ID>
<Packet_Id>{84ca597c-05e2-4357-897c-892f428c35ce}</Packet_Id>
<Priority>0</Priority>
<Source_Address>1:11111111111111</Source_Address>
<Destination_Address>2:LA3222222222222</Destination_Address>
<Body>Some TExt</Body>
<Billing />
</Ssm_Packet>

Бин, который я определил для jaxb, выглядит следующим образом:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement(name="Ssm_Packet")
public class Ssm_Packet {
@XmlElement(name="Version")
private String version;
private String protocol_ID;
private String packet_Id;
private String priority;
private String source_Address;
private String destination_Address;
private String body;
private String billing;
/**
 * @return the version
 */
public String getVers() {
    return version;
}
/**
 * @param version the version to set
 */
public void setVers(String Version) {
    this.version = Version;
}
/**
 * @return the protocol_ID
 */
public String getProtocol_ID() {
    return protocol_ID;
}
/**
 * @param protocol_ID the protocol_ID to set
 */
public void setProtocol_ID(String Protocol_ID) {
    this.protocol_ID = Protocol_ID;
}
/**
 * @return the packet_Id
 */
public String getPacket_Id() {
    return packet_Id;
}
/**
 * @param packet_Id the packet_Id to set
 */
public void setPacket_Id(String Packet_Id) {
    this.packet_Id = Packet_Id;
}
/**
 * @return the priority
 */
public String getPriority() {
    return priority;
}
/**
 * @param priority the priority to set
 */
public void setPriority(String Priority) {
    this.priority = Priority;
}
/**
 * @return the source_Address
 */
public String getSource_Address() {
    return source_Address;
}
/**
 * @param source_Address the source_Address to set
 */
public void setSource_Address(String Source_Address) {
    this.source_Address = Source_Address;
}
/**
 * @return the destination_Address
 */
public String getDestination_Address() {
    return destination_Address;
}
/**
 * @param destination_Address the destination_Address to set
 */
public void setDestination_Address(String Destination_Address) {
    this.destination_Address = Destination_Address;
}
/**
 * @return the body
 */
public String getBody() {
    return body;
}
/**
 * @param body the body to set
 */
public void setBody(String Body) {
    this.body = Body;
}
/**
 * @return the billing
 */
public String getBilling() {
    return billing;
}
/**
 * @param billing the billing to set
 */
public void setBilling(String Billing) {
    this.billing = Billing;
}
}

Теперь, если я позволю JAXb разархивировать XML в этом объекте, он не будет заполнять значения xml, если теги xml не имеют заглавной буквы.

Может кто-нибудь помочь мне, как распаковать эти значения в моем бобе?

ТНХ

1 Ответ

4 голосов
/ 14 сентября 2011

Вы можете использовать аннотацию @XmlElement, чтобы указать имя элемента, соответствующее каждому из ваших полей / свойств.

/**
 * @return the protocol_ID
 */
@XmlElement(name="Protocol_ID")
public String getProtocol_ID() {
    return protocol_ID;
}

Если вы хотите аннотировать свои поля вместо этого, вам нужно будет установить@XmlAccessorType(XmlAccessType.FIELD):

@XmlRootElement(name="Ssm_Packet")
@XmlAccessorType(XmlAccessType.FIELD)
public class Ssm_Packet {
    @XmlElement(name="Version")
    private String version;
}

EclipseLink JAXB (MOXy) также содержит расширение, в котором можно переопределить стандартный алгоритм JAXB для преобразования имен полей / свойств Java вИмена XML:

...