Java 使用@ResourceMapping和@ModelAttribute访问SpringPortlet控制器内的RequestBody
我的问题与以下帖子类似: 及 我在那里试过Tipps,但没有成功。 我拥有以下技术:Java 使用@ResourceMapping和@ModelAttribute访问SpringPortlet控制器内的RequestBody,java,json,kendo-ui,liferay-6,spring-portlet-mvc,Java,Json,Kendo Ui,Liferay 6,Spring Portlet Mvc,我的问题与以下帖子类似: 及 我在那里试过Tipps,但没有成功。 我拥有以下技术: liferay portal 6.2 CE 基于spring 3.0.7的liferay自定义portlet插件 jsp的剑道用户界面 在客户端,我生成了一个字符串化的json对象,该对象具有KendoUIforJSP的功能,并在请求主体中提交。目前它只包含一些过滤器参数(但也可以包含服务器端分页、排序、分组等的其他参数) 在Firefox开发者工具中,请求主体(有效负载)如下所示: { "filter" :
{
"filter" : {
"logic" : "and",
"filters" : [{
"field" : "name",
"value" : ""
}, {
"field" : "city",
"value" : ""
}, {
"field" : "zip",
"value" : ""
}, {
"field" : "country",
"value" : ""
}
]
}
}
@ResourceMapping(value = "test")
public void searchProviderTest(ResourceRequest request, ResourceResponse response,
@ModelAttribute("filter") DataSourceRequest dataSourceRequest) {
LOGGER.info(">>>>>> JsonOjekt per Parameter übergeben: " + request.getParameter("filter"));
LOGGER.info(">>>>>>>> DatasourceRequest: " + dataSourceRequest);
}
在服务器端,我有一个用于该结构的POJO。我在一个SpringWebMVCServlet环境中成功地测试了这一点。使用@RequestBody和Jackson可以反序列化JSON对象
在liferay portlet环境中工作我无法使用@RequestBody和httpServletRequest
控制器如下所示:
{
"filter" : {
"logic" : "and",
"filters" : [{
"field" : "name",
"value" : ""
}, {
"field" : "city",
"value" : ""
}, {
"field" : "zip",
"value" : ""
}, {
"field" : "country",
"value" : ""
}
]
}
}
@ResourceMapping(value = "test")
public void searchProviderTest(ResourceRequest request, ResourceResponse response,
@ModelAttribute("filter") DataSourceRequest dataSourceRequest) {
LOGGER.info(">>>>>> JsonOjekt per Parameter übergeben: " + request.getParameter("filter"));
LOGGER.info(">>>>>>>> DatasourceRequest: " + dataSourceRequest);
}
DataRequestObject没有值。我看到了所有属性,但它们都是空的。并且没有请求参数“filter”(已检查)
以下是我的DataSourceRequest对象(摘要):
公共类数据源请求{
私人网页;
私有int页面大小;
私服;
私有int-skip;
私有列表排序;
私有列表组;
私有列表聚合;
私有HashMap数据;
专用过滤器描述器过滤器;
公共数据源请求(){
filter=新的FilterDescriptor();
data=newhashmap();
}
…(接受者和接受者)
公共静态类FilterDescriptor{
私有字符串逻辑;
私有列表过滤器;
私有字符串字段;
私人客体价值;
私有字符串运算符;
私有布尔ignoreCase=true;
公共过滤器描述器(){
过滤器=新的ArrayList();
}
…(接受者和接受者)
几周后,我一直在寻找解决方案,但我没有使用portlet控制器将JSON对象转换(反序列化?)为DataSourceRequest对象。我甚至不知道如何从portlet控制器访问请求正文(负载)中的JSON字符串
在第二篇文章之后,嵌套对象可能是问题所在。我联系了kendo ui支持部门,询问如何提交请求以获得文章中描述的格式。但他们告诉我,这是不可能的(例如,使用数据源对象的parameterMap属性)我必须在服务器端解决它
第一篇文章描述了一个带有@modeldattribute的解决方案,但是我只得到了空对象,当我尝试使用@RequestParam获取JSON时,我得到了一个错误,该参数不在请求中(我想是因为它在主体中)
我曾考虑在SpringWebMVCServlet的基础上建立一个额外的RESTFul API,我甚至尝试过,它也能工作,但我不确定这是否真的有意义,因为liferay已经有了一个RESTFul-API
是否有一种方法可以将Portlet控制器中的JSON对象转换为JAVA对象?或我需要额外的API吗?
欢迎提供任何提示!!在使用Liferay序列化和反序列化Json时,我遇到了同样的问题。我的解决方案是将Json作为表单数据中的参数发送。这样,我就可以使用以下方法检索Json:
String paramJson = ParamUtil.getString(request, "myJson");
然后利用api进行反序列化:
new Gson().fromJson(paramJson, MyPOJO.class);
你和格森不会有那么多麻烦。
您还可以使用Gson在服务返回时序列化对象,这将避免Liferay无法正确序列化的嵌套对象出现问题
此代码显示如何将Json作为请求体发送:
请求将由MVCPortlet中的方法“ServerResource”处理
var portletUrl = Liferay.PortletURL.createResourceURL();
portletUrl.setPortletId(<portletId>);
portletUrl.setResourceId('publicar'); // Any identifier
var formData = new FormData();
formData.append(<portlet-namespace> + 'myJson', JSON.stringify(object));
var xhr = new XMLHttpRequest();
xhr.addEventListener('load', callbackSuccess, false);
xhr.open('POST', urlPortlet);
xhr.send(formData);
var-portletUrl=Liferay.portletUrl.createResourceURL();
portletUrl.setPortletId();
portletUrl.setResourceId('publicar');//任何标识符
var formData=new formData();
append(+'myJson',JSON.stringify(object));
var xhr=new XMLHttpRequest();
xhr.addEventListener('load',callbackSuccess,false);
xhr.open('POST',urlPortlet);
xhr.send(formData);
我在使用Liferay序列化和反序列化Json时遇到了同样的问题。我的解决方案是将Json作为表单数据中的参数发送。这样,我就可以使用以下方法检索Json:
String paramJson = ParamUtil.getString(request, "myJson");
然后利用api进行反序列化:
new Gson().fromJson(paramJson, MyPOJO.class);
你和格森不会有那么多麻烦。
您还可以使用Gson在服务返回时序列化对象,这将避免Liferay无法正确序列化的嵌套对象出现问题
此代码显示如何将Json作为请求体发送:
请求将由MVCPortlet中的方法“ServerResource”处理
var portletUrl = Liferay.PortletURL.createResourceURL();
portletUrl.setPortletId(<portletId>);
portletUrl.setResourceId('publicar'); // Any identifier
var formData = new FormData();
formData.append(<portlet-namespace> + 'myJson', JSON.stringify(object));
var xhr = new XMLHttpRequest();
xhr.addEventListener('load', callbackSuccess, false);
xhr.open('POST', urlPortlet);
xhr.send(formData);
var-portletUrl=Liferay.portletUrl.createResourceURL();
portletUrl.setPortletId();
portletUrl.setResourceId('publicar');//任何标识符
var formData=new formData();
append(+'myJson',JSON.stringify(object));
var xhr=new XMLHttpRequest();
xhr.addEventListener('load',callbackSuccess,false);
xhr.open('POST',urlPortlet);
xhr.send(formData);
要与hera分享我的经验,请执行以下步骤:
<requires-namespaced-parameters>false</requires-namespaced-parameters>
false
要与hera分享我的经验,请执行以下步骤: