我正在尝试使用Springboot消耗通过REST Web服务接收的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>
但是没有读取播放器的详细信息,当对收到的数据执行toString时,会得到以下信息。
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))
当我将播放器标签括起来时,我可以获得信息
<players> ... </players>
但是更改XML对其他地方有很大的影响,因此希望可以按原样修复XML。
我的代码如下所示...
@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))
@Data批注是Lombok项目,因此可以创建吸气剂,设置器等。
最佳答案
当我尝试您的代码时,出现错误:
Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 7 counts of IllegalAnnotationExceptions
If a class has @XmlElement property, it cannot have @XmlValue property.
this problem is related to the following location:
at private java.lang.String PlayerXML.value
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
this problem is related to the following location:
at public java.lang.String PlayerXML.getValue()
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
Class has two properties of the same name "players"
this problem is related to the following location:
at public java.util.List TeamResultXML.getPlayers()
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
this problem is related to the following location:
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
Class has two properties of the same name "goalkeeper"
this problem is related to the following location:
at public boolean PlayerXML.isGoalkeeper()
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
this problem is related to the following location:
at private boolean PlayerXML.goalkeeper
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
Class has two properties of the same name "number"
this problem is related to the following location:
at public int PlayerXML.getNumber()
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
this problem is related to the following location:
at private int PlayerXML.number
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
Class has two properties of the same name "position"
this problem is related to the following location:
at public java.lang.String PlayerXML.getPosition()
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
this problem is related to the following location:
at private java.lang.String PlayerXML.position
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
Class has two properties of the same name "sub"
this problem is related to the following location:
at public java.lang.String PlayerXML.getSub()
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
this problem is related to the following location:
at private java.lang.String PlayerXML.sub
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
Class has two properties of the same name "value"
this problem is related to the following location:
at public java.lang.String PlayerXML.getValue()
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
this problem is related to the following location:
at private java.lang.String PlayerXML.value
at PlayerXML
at private java.util.List TeamResultXML.players
at TeamResultXML
at public TeamResultXML ResultDetailsRequestModel.getHome_team()
at ResultDetailsRequestModel
at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:445)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:462)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at Test8.main(Test8.java:17)
通过将
@XmlAccessorType(XmlAccessType.FIELD)
添加到所有3个类中来解决此问题时,我得到了预期的输出: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]]]]