Post json 至 struts 2 次操作
Post json to struts 2 action
我需要 post 一个简单的 json 对象到 Struts 2 动作,你能告诉我我错过了什么吗:
要保存的 Java 对象:
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Integer id;
@Column(name = "code")
private String code;
@Column(name = "libelle_fr")
private String libelleFr;
@Column(name = "libelle_nl")
private String libelleNl;
我用的是alpine.js但这是一个细节,发送请求调用的脚本是这个:
<script>
function postForm() {
return {
indicateurDictionnaireForm: {
libelleFr: '',
libelleNl: '',
code: ''
},
message: '',
submitData() {
this.message = ''
fetch('<%= request.getContextPath() %>/mesures.ce.save.action', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
dataType:"json",
body: JSON.stringify(this.indicateurDictionnaireForm)
})
.then(() => {
this.message = 'Form sucessfully submitted!'
})
.catch(() => {
this.message = 'Ooops! Something went wrong!'
})
}
}
}
</script>
发送到操作的json是:
{
"libelleFr":"fr",
"libelleNl":"nl",
"code":"sample"
}
在我的操作文件中,有一个从前面调用的方法:
private IndicateurDictionnaire indicateurDictionnaireForm;
// Action to save an indicateurDictionnaireto database
@Action(value = "mesures.indicateurs.ce.save", results = {
@Result(name = "success", type = "json", params = {"root", "indicateurDictionnaireForm"}),
@Result(name = "input", type = "tiles", params = {"root", "indicateurDictionnaireForm"}, location = "viewMesureCoutUnitaire")})
public String save(IndicateurDictionnaire indicateurDictionnaire, String libelleFr, String libelleNl, String code) {
dictionnaireIndicateurBo.saveIndicateurDictionnaire(indicateurDictionnaire);
return SUCCESS;
}
根据 struts2 json 插件,如果格式正确,json 应该映射到我的对象,但如果我在调试中查看,字段为空。
你知道我怎样才能至少在我的操作方法中看到 json 请求吗?
映射到操作的方法不使用方法签名中的任何参数。因此,您需要删除这些参数并将 json
拦截器添加到操作配置中。
此字段被 json 拦截器用作 root
object,不应为 null
。
IndicateurDictionnaire indicateurDictionnaire;
// getter and setter should be added
@Action(value = "mesures.indicateurs.ce.save", results = {
@Result(name = "success", type = "json", params = {"root", "indicateurDictionnaire"})
}, interceptorRefs = @InterceptorRef(value = "json", params = {"root", "indicateurDictionnaire"}))
public String save() {
dictionnaireIndicateurBo.saveIndicateurDictionnaire(indicateurDictionnaire);
return SUCCESS;
}
我需要 post 一个简单的 json 对象到 Struts 2 动作,你能告诉我我错过了什么吗:
要保存的 Java 对象:
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Integer id;
@Column(name = "code")
private String code;
@Column(name = "libelle_fr")
private String libelleFr;
@Column(name = "libelle_nl")
private String libelleNl;
我用的是alpine.js但这是一个细节,发送请求调用的脚本是这个:
<script>
function postForm() {
return {
indicateurDictionnaireForm: {
libelleFr: '',
libelleNl: '',
code: ''
},
message: '',
submitData() {
this.message = ''
fetch('<%= request.getContextPath() %>/mesures.ce.save.action', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
dataType:"json",
body: JSON.stringify(this.indicateurDictionnaireForm)
})
.then(() => {
this.message = 'Form sucessfully submitted!'
})
.catch(() => {
this.message = 'Ooops! Something went wrong!'
})
}
}
}
</script>
发送到操作的json是:
{
"libelleFr":"fr",
"libelleNl":"nl",
"code":"sample"
}
在我的操作文件中,有一个从前面调用的方法:
private IndicateurDictionnaire indicateurDictionnaireForm;
// Action to save an indicateurDictionnaireto database
@Action(value = "mesures.indicateurs.ce.save", results = {
@Result(name = "success", type = "json", params = {"root", "indicateurDictionnaireForm"}),
@Result(name = "input", type = "tiles", params = {"root", "indicateurDictionnaireForm"}, location = "viewMesureCoutUnitaire")})
public String save(IndicateurDictionnaire indicateurDictionnaire, String libelleFr, String libelleNl, String code) {
dictionnaireIndicateurBo.saveIndicateurDictionnaire(indicateurDictionnaire);
return SUCCESS;
}
根据 struts2 json 插件,如果格式正确,json 应该映射到我的对象,但如果我在调试中查看,字段为空。
你知道我怎样才能至少在我的操作方法中看到 json 请求吗?
映射到操作的方法不使用方法签名中的任何参数。因此,您需要删除这些参数并将 json
拦截器添加到操作配置中。
此字段被 json 拦截器用作 root
object,不应为 null
。
IndicateurDictionnaire indicateurDictionnaire;
// getter and setter should be added
@Action(value = "mesures.indicateurs.ce.save", results = {
@Result(name = "success", type = "json", params = {"root", "indicateurDictionnaire"})
}, interceptorRefs = @InterceptorRef(value = "json", params = {"root", "indicateurDictionnaire"}))
public String save() {
dictionnaireIndicateurBo.saveIndicateurDictionnaire(indicateurDictionnaire);
return SUCCESS;
}