簡體   English   中英

使用JaxB編組時如何避免添加特定的元素/值

[英]When using JaxB marshalling how to avoid adding a particular element/value

我有一個XML數據,如下所示。 我需要能夠編組/解組。 目標很簡單,我在那里沒有遇到任何問題

XML的代碼段

 <?xml version=\\"1.0\\" encoding=\\"UTF-8\\" standalone=\\"yes\\"?> <messages> <message msg-id=\\"1\\" msg-type=\\"ERROR\\" msg=\\"\\"/> <message msg-id=\\"2\\" msg-type=\\"INFO\\" msg=\\"\\"/> <message msg-id=\\"3\\" msg-type=\\"WARNING\\" msg=\\"\\"/> </messages> 

在我的POJO主類Messages中,我有一個哈希映射,用於將消息映射到ID。 我想讓messagemap不進入XML。 簡而言之,我想知道它們是否是任何特定的批注或方式,以便在編組時不使用特定的注釋(在本例中為HashMap)避免生成的XML

編組時生成的XML片段

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <messages> <message msg-id="1" msg-type="ERROR" msg=" madrid"></message> <message msg-id="2" msg-type="INFO" msg="portugal"></message> <message msg-id="3" msg-type="WARNING" msg="barcelona"></message> <messageMap> <entry> <key>3</key> <value msg-id="3" msg-type="WARNING" msg="barcelona"></value> </entry> <entry> <key>2</key> <value msg-id="2" msg-type="INFO" msg="portugal"></value> </entry> <entry> <key>1</key> <value msg-id="1" msg-type="ERROR" msg=" madrid"></value> </entry> </messageMap> </messages> 

在我的POJO主類Messages中,我有一個哈希映射,用於將消息映射到ID。 我想讓messagemap不進入XML。

==============================================================

package code.rfid.common.salami;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

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

    @XmlValue
    protected String value;
    @XmlAttribute(name = "msg-id")
    protected String msgId;
    @XmlAttribute(name = "msg-type")
    protected String msgType;
    @XmlAttribute(name = "msg")
    protected String msg;

    public static String INFO = "info";
    public static String ERROR = "error";
    public static String WARNING = "warning";

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getMsgId() {
        return msgId;
    }

    public void setMsgId(String value) {
        this.msgId = value;
    }

    @Override
    public String toString() {
        return "Message [value=" + value + ", msgId=" + msgId + ", msgType="
                + msgType + ", msg=" + msg + "]";
    }

    public String getMsgType() {
        return msgType;
    }

    public void setMsgType(String value) {
        this.msgType = value;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String value) {
        this.msg = value;
    }
}

=====================================

package code.rfid.common.salami;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

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

    @Override
    public String toString() {
        return "Messages [message=" + message + ", messageMap=" + messageMap
                + "]";
    }

    protected List<Message> message;
    protected HashMap<String, Message> messageMap;

    public List<Message> getMessage() {
        if (message == null) {
            message = new ArrayList<Message>();
        }
        return this.message;
    }

    public HashMap<String, Message> getMessageMap() {
        if (messageMap == null) {
            messageMap = new HashMap<String, Message>();
        }
        return messageMap;
    }

    public void populateMessageMap()
    {
        messageMap = new HashMap<String, Message>();
        if(message == null || message.isEmpty())
            return;
        for(Message _message: message)
        {
            messageMap.put(_message.getMsgId(), _message);
        }
    }
}

========================編組和解組代碼

package code.rfid.common;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import code.rfid.common.salami.Messages;

public class MessageJaxBPort {

    static String responseString ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
                            + "<messages>"
                            + "<message msg-id=\"1\" msg-type=\"ERROR\" msg=\" madrid\"/>"
                            + "<message msg-id=\"2\" msg-type=\"INFO\" msg=\"portugal\"/>"
                            + "<message msg-id=\"3\" msg-type=\"WARNING\" msg=\"barcelona\"/>"
                        + "</messages>";

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Messages.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

            Messages mapmessages = (Messages) jaxbUnmarshaller.unmarshal(new StringReader( responseString));
            System.out.println("UserInfo object :- " + mapmessages.toString());

            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(mapmessages, System.out);
        } catch (JAXBException jaxbEx) {
            jaxbEx.printStackTrace();
        }
    }
}

@XmlTransient批注添加到您的消息映射屬性中,如下所示:

@XmlTransient
public HashMap<String, Message> getMessageMap() {

這將導致封送拆封器排除此屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM