2016-08-30 3 views
0

Я читал о JAXB, и я новичок в этом. Я хочу следующий XML из моих классовjaxb аннотация для следующего xml

<response> 
    <command></command> 
    <message></message> 
</response> 

Вот мои классы

Абстрактный класс Родитель - Ответ

@XmlRootElement 
abstract class Response { 
String command; 

public Response() { 
    // TODO Auto-generated constructor stub 
} 

public Response(String command) { 
    this.command = command; 
} 

@XmlElement 
public String getCommand() { 
    return command; 
} 

public void setCommand(String command) { 
    this.command = command; 
} 
} 

Детский класс: MessageResposne

@XmlRootElement 
class MessageResponse extends Response { 
String message; 

public MessageResponse() { 
    // TODO Auto-generated constructor stub 
} 

public MessageResponse(String command, String message) { 
    super(command); 
    this.message = message; 
} 

@XmlElement 
public String getMessage() { 
    return message; 
} 

public void setMessage(String message) { 
    this.message = message; 
} 

} 

и в основном классе

try { 
     objContext = JAXBContext.newInstance(Response.class); 
     objMarshaller = objContext.createMarshaller(); 
    } catch (JAXBException e) { 
     e.printStackTrace(); 
     } 

, но это производит

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><response><command>setname</command></response> 

Что манипуляция я должен сделать для желаемого resposne

ответ

1

Would @XmlSeeAlso помощь?

@XmlRootElement 
@XmlSeeAlso({MessageResponse.class}) 
abstract class Response { 
    String command; 

    public Response() { 
    // TODO Auto-generated constructor stub 
    } 

    public Response(String command) { 
    this.command = command; 
    } 

    @XmlElement 
    public String getCommand() { 
    return command; 
    } 

    public void setCommand(String command) { 
    this.command = command; 
    } 
} 

Это говорит JAXB также связывать MessageReponse при связывании Response.

Кроме того, MessageResponse класс должен быть связан с именем response элемента, изменив первую линию MessageResponse.java к:

@XmlRootElement(name="response") 

я мог воспроизвести желаемый результат с помощью следующего главного класса:

package test; 

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

public class Main{ 
    public static void main(String[] args) 
    { 
    try { 
     JAXBContext objContext = JAXBContext.newInstance(Response.class); 
     Marshaller objMarshaller = objContext.createMarshaller(); 
     objMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     MessageResponse mr = new MessageResponse("", ""); 
     objMarshaller.marshal(mr, System.out); 
    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

Показана ошибка: [Fatal Error]: 1: 56: преждевременный конец файла. java.lang.NullPointerException –

+0

Я добавил @XmlRootElement в MessageResponse класс, и это производит SetName мое сообщение

+0

Это выглядит хорошо. Последний недостающий элемент - это атрибут 'name' для XmlRootElement. Я отредактировал ответ. –

Смежные вопросы