Heim > Fragen und Antworten > Hauptteil
Wie empfängt Spring 4.3.7 komplexe Typen wie von Ajax übergebene Listen?
Ich werde gemeldet, wenn ich sie direkt übergebe
org.springframework.beans.InvalidPropertyException: Ungültige Eigenschaft'uAnswers0' der Bean-Klasse [cn.xxx.entity.UAnswerList]:
Ich habe nach Online-Lösungen gesucht und festgestellt, dass sie im Grunde genommen aus der Vergangenheit stammen, meist 3.x-Lösungen:
Die im indizierten Eigenschaftspfad 'uAnswers0' referenzierte Eigenschaft ist weder ein Array noch eine Liste noch eine Karte ; zurückgegebener Wert war
[cn.xxx.entity.UAnswer@2d3e47ed]
1. Jackson-Jar-Paket hinzufügen:
jackson-core
jackson-mapper
jackson-databind
2.XML konfigurieren
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list >
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</list>
</property>
</bean>
Einer ist, dass AnnotationMethodHandlerAdapter veraltet ist, und der andere meldet immer noch einen Fehler, und das wurde mir gesagt
org.springframework.web.util.NestedServletException: Anforderungsverarbeitung fehlgeschlagen; verschachtelte Ausnahme istorg.springframework.beans.InvalidPropertyException: Ungültige Eigenschaft2. UAnswerList-Klasse'uAnswers0' der Bean-Klasse [cn.xxx.entity.UAnswerList]:
Property referenziert im indizierten Eigenschaftspfad „uAnswers0“ ist weder ein Array noch eine Liste oder ein Map-Rückgabewert war
[cn.xxx.entity.UAnswer@70671304]
Der detaillierte Code lautet wie folgt:
1. UAnswer-Klassepublic class UAnswer { private Integer uaid; private Integer quid;//用户id private Integer qnid;//问卷id private Integer qid;//问题id private Integer oid;//选项id private String remark;//备注 private String createtime; public Integer getUaid() { return uaid; } public void setUaid(Integer uaid) { this.uaid = uaid; } public Integer getQuid() { return quid; } public void setQuid(Integer quid) { this.quid = quid; } public Integer getQnid() { return qnid; } public void setQnid(Integer qnid) { this.qnid = qnid; } public Integer getQid() { return qid; } public void setQid(Integer qid) { this.qid = qid; } public Integer getOid() { return oid; } public void setOid(Integer oid) { this.oid = oid; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } }
public class UAnswerList {
private Integer quid;//用户id
private Integer qnid;//问卷id
private List<UAnswer> uAnswers;
public Integer getQuid() {
return quid;
}
public void setQuid(Integer quid) {
this.quid = quid;
}
public Integer getQnid() {
return qnid;
}
public void setQnid(Integer qnid) {
this.qnid = qnid;
}
public List<UAnswer> getuAnswers() {
return uAnswers;
}
public void setuAnswers(List<UAnswer> uAnswers) {
this.uAnswers = uAnswers;
}
}
@ResponseBody
@RequestMapping("addAnswer.do")
public String addAnswer(HttpServletRequest request, HttpServletResponse response, UAnswerList uAnswers){
ReturnResult r = new ReturnResult();
r.setCode(1);
r.setMsg("findAllNowCity success");
if(uAnswers==null||uAnswers.getQnid()==null||uAnswers.getQuid()==null||uAnswers.getuAnswers()==null){
r.setCode(-1);
r.setMsg("尚未填写问卷");
return r.toJsonString();
}
//相关操作
return r.toJsonString();
}
4. Ajax-simulierte Daten
function yaya(){
$.ajax({
url: "http://192.168.0.251:8080/jsapi/addAnswer.do",
data: {
quid:"odeq5uFtR835lZGTKxLpGy9jHEDU",
qnid:1,
uAnswers:[
{
qid:1,
oid:2
},
{
qid:1,
oid:3
},
{
qid:2,
oid:7
},
{
qid:3,
oid:14
},
{
qid:6,
oid:15,
remark:"hahaha"
},
]
},
type: "post",
cache : false,
dataType:'json',
success: function(data) {
console.log(data);
document.getElementById("resurl").innerHTML= JSON.stringify(data);
},
});
}
Möglicherweise liegt auch ein Problem mit dem Ajax-Datenspleißformat vor, aber ich weiß vorerst nicht, wie ich es lösen kann. .
伊谢尔伦2017-05-16 13:27:28
@ResponseBody
@RequestMapping("addAnswer.do")
public String addAnswer(HttpServletRequest request, HttpServletResponse response, @RequestBody UAnswerList uAnswers){
ReturnResult r = new ReturnResult();
r.setCode(1);
r.setMsg("findAllNowCity success");
if(uAnswers==null||uAnswers.getQnid()==null||uAnswers.getQuid()==null||uAnswers.getuAnswers()==null){
r.setCode(-1);
r.setMsg("尚未填写问卷");
return r.toJsonString();
}
//相关操作
return r.toJsonString();
}
漂亮男人2017-05-16 13:27:28
2个地方需要修改:
使用@RequestBody注解,表示使用http body的内容,如下:
@ResponseBody
@RequestMapping("addAnswer.do")
public String addAnswer(HttpServletRequest request, HttpServletResponse response, @RequestBody UAnswerList uAnswers){ 省略 }
js端要使用json传送数据,所以需要指定application/json类型并使用JSON.stringify来将对象转成json格式,如下:
function yaya(){
$.ajax({
url: "http://192.168.0.251:8080/jsapi/addAnswer.do",
contentType:"application/json", //新增
data: JSON.stringify({
quid:"odeq5uFtR835lZGTKxLpGy9jHEDU",
qnid:1,
uAnswers:[
{
qid:1,
oid:2
},
{
qid:1,
oid:3
},
{
qid:2,
oid:7
},
{
qid:3,
oid:14
},
{
qid:6,
oid:15,
remark:"hahaha"
},
]
}),
type: "post",
cache : false,
dataType:'json',
success: function(data) {
console.log(data);
document.getElementById("resurl").innerHTML= JSON.stringify(data);
},
});
}