@RequestBody с абстрактным классом и XML

#java #spring-boot #api #rest #abstract-class

Вопрос:

Я пытаюсь начать с SpringBoot и Java, и мой проект заключается в реализации этого XML

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <ns3:local xmlns:ns2="http://test.com/v21/" xmlns:ns3="uri">
   <messageHeader>
     <logon>nm</logon>
     <password>@85</password>
   </messageHeader>
   <messageBody>
    <IssueClientRequest>
       <irrevocable>YES</irrevocable>
       <applicable_rules>LATE</applicable_rules>                                                                                               
     </IssueClientRequest>
   </messageBody>
 </ns3:local> 
 

Я создал поэтому некоторые сущности с абстрактным классом, потому что IssueClientRequest, IssueClientAmended и т.д. Могут отличаться, но структура xml останется прежней .

 
@JsonSubTypes(value = {
        @JsonSubTypes.Type(value = IssueClientRequest.class, name = "IssueClientRequest")
})
public abstract class Instr {}

@XmlRootElement(name = "IssueClientRequest")
public class IssueClientRequest extends Instr {

    @XmlElement(name = "irrevocable", required = true)
    private String irrevocable;
    @XmlElement(name = "applicable_rules", required = true)
    private String applicable_rules;

}

@JsonSubTypes(value = {
        @JsonSubTypes.Type(value = MessageIssueClientRequest.class, name = "IssueClientRequest")
})
public abstract class Message {
    @XmlElementWrapper(name="ns3")
    private MessageHeader messageHeader;

    public MessageHeader getMessageHeader() {
        return messageHeader;
    }

    public void setMessageHeader(MessageHeader messageHeader) {
        this.messageHeader = messageHeader;
    }
}

public class MessageIssueClientRequest extends Message {

    @XmlElementWrapper(name="messageBody")
    @XmlElement(name="IssueClientRequest",     type= IssueClientRequest.class)
    private Instr instr;

    public Instr getInstr() {
        return instr;
    }

    public void setInstr(Instr instr) {
        this.instr = instr;
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "messageHeader")
public class MessageHeader {
    @XmlElement(name = "logon", required = true)
    private String logon;
    @XmlElement(name = "password", required = true)
    private String password;

    public String getLogon() {
        return logon;
    }

    public void setLogon(String logon) {
        this.logon = logon;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

@RestController
public class InstrController {
    @RequestMapping(value="/instr",method = RequestMethod.POST, consumes = {MediaType.APPLICATION_XML_VALUE})
    Message newMessage(@RequestBody Message message) {
        System.out.println(message.getMessageHeader().getLogon());
        return message;
    }
}

 

У вас есть идеи, в чем может быть проблема ? Архитектура одна ?

Большое спасибо за вашу помощь.