Java 使用Springboot从REST post请求读取XML

Java 使用Springboot从REST post请求读取XML,java,xml,rest,spring-boot,Java,Xml,Rest,Spring Boot,我正在尝试使用Springboot使用RESTWebService接收的XML,我是新手,希望这是我犯的一个相当小的错误 我认为XML的结构可能很糟糕,但我有以下几点 <ResultDetailsRequestModel> <tournament>Premier League</tournament> <fixture_date>2018-08-10</fixture_date> <description>result<

我正在尝试使用Springboot使用RESTWebService接收的XML,我是新手,希望这是我犯的一个相当小的错误

我认为XML的结构可能很糟糕,但我有以下几点

<ResultDetailsRequestModel>
<tournament>Premier League</tournament>
<fixture_date>2018-08-10</fixture_date>
<description>result</description>
<home_team>
    <team_name>Man Utd</team_name>
    <score>2</score>
    <ht_score>1</ht_score>
    <possession>46.3</possession>
    <shots_on_target>6</shots_on_target>
    <shots_off_target>1</shots_off_target>
    <corners>2</corners>
    <player gk="true" position="G" number="1">D de Gea</player>
    <player position="D" number="2">V Lindelof</player>
</home_team>
</ResultDetailsRequestModel>
当我在播放器标签周围加上

<players> ... </players> 
我收到的数据

ResultDetailsRequestModel(tournament=Premier League, fixture_date=Fri Aug 10 01:00:00 BST 2018, description=result, home_team=TeamResultXML(team_name=Man Utd, score=2, ht_score=1, possession=46.3, shots_on_target=6, shots_off_target=1, corners=2, players=null))

@Data注释是project Lombok,因此创建getter、setter等。

当我尝试您的代码时,会出现错误:

线程“main”com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException中的异常:7次illegalannotationException计数 如果类具有@XmlElement属性,则它不能具有@XmlValue属性。 此问题与以下位置有关: 位于private java.lang.String PlayerXML.value 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 此问题与以下位置有关: 在public java.lang.String PlayerXML.getValue()中 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 类有两个同名的属性“players” 此问题与以下位置有关: 在public java.util.List TeamResultXML.getPlayers()中 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 此问题与以下位置有关: 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 类有两个同名的属性“守门员” 此问题与以下位置有关: 在public boolean PlayerXML.iskeeper()上 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 此问题与以下位置有关: 在private boolean PlayerXML.keeper 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 类有两个同名的属性“number” 此问题与以下位置有关: 在public int PlayerXML.getNumber()上 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 此问题与以下位置有关: 在private int PlayerXML.number 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 类有两个同名的属性“position” 此问题与以下位置有关: 在public java.lang.String PlayerXML.getPosition()中 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 此问题与以下位置有关: 位于private java.lang.String PlayerXML.position 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 类有两个同名的属性“sub” 此问题与以下位置有关: 在public java.lang.String PlayerXML.getSub()上 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 此问题与以下位置有关: 在private java.lang.String PlayerXML.sub 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 类有两个同名的属性“value” 此问题与以下位置有关: 在public java.lang.String PlayerXML.getValue()中 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 此问题与以下位置有关: 位于private java.lang.String PlayerXML.value 在PlayerXML上 在private java.util.List TeamResultXML.players 在TeamResultXML上 在public TeamResultXML ResultDetailsRequestModel.getHome_team()中 在ResultDetailsRequestModel 位于com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91) 位于com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:445) 位于com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.(JAXBContextImpl.java:277) 位于com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.(JAXBContextImpl.java:124) 位于com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123) 位于com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法
@RestController
@RequestMapping("results") // http://localhost:8888/results
public class ResultsController {

    @PostMapping(
            consumes = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE },
            produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE }
    )
    public String createBets(@RequestBody ResultDetailsRequestModel resultDetails) {
        return "Received details: " + resultDetails.toString();
    }
}
@Data
@XmlRootElement(name="ResultDetailsRequestModel")
public class ResultDetailsRequestModel {
    private String tournament;
    private Date fixture_date;
    private String description;
    private TeamResultXML home_team;

}
@Data
@XmlRootElement(name="home_team")
public class TeamResultXML implements Serializable {
    private String team_name;
    private int score;
    private int ht_score;
    private double possession;
    private int shots_on_target;
    private int shots_off_target;
    private int corners;
    @XmlElement(name="player")
    private List<PlayerXML> players;

}
@Data
@XmlRootElement(name="player")
public class PlayerXML implements Serializable {
    @XmlAttribute(name="gk")
    private boolean goalkeeper;

    @XmlAttribute(name="position")
    private String position;

    @XmlAttribute(name="number")
    private int number;

    @XmlAttribute(name="sub")
    private String sub;

    @XmlValue
    private String value;
}
ResultDetailsRequestModel(tournament=Premier League, fixture_date=Fri Aug 10 01:00:00 BST 2018, description=result, home_team=TeamResultXML(team_name=Man Utd, score=2, ht_score=1, possession=46.3, shots_on_target=6, shots_off_target=1, corners=2, players=null))
ResultDetailsRequestModel [tournament=Premier League, fixture_date=Fri Aug 10 00:00:00 EDT 2018, description=result, home_team=TeamResultXML [team_name=Man Utd, score=2, ht_score=1, possession=46.3, shots_on_target=6, shots_off_target=1, corners=2, players=[PlayerXML [goalkeeper=true, position=G, number=1, sub=null, value=D de Gea], PlayerXML [goalkeeper=false, position=D, number=2, sub=null, value=V Lindelof]]]]