【发布时间】:2018-03-16 00:10:15
【问题描述】:
我的问题类似于以下帖子: JSON ajax POST to Spring Portlet Controller @ResourceMapping conversion issue 和 @ResourceMapping that accepts JSON from Ajax request
我在那里尝试过 Tipps,但没有成功。 我拥有以下技术:
- liferay-portal 6.2 CE
- 基于 spring 3.0.7 的 liferay 自定义 portlet-plugin
- 用于 jsp 的 kendo-ui
在客户端,我生成了一个字符串化的 json-Object,它具有 jsp 的 kendo-ui 功能,并在请求正文中提交。目前它只包含一些过滤器参数(但它也可以包含用于服务器端分页、排序、分组的其他参数......)。
在 Firefox 开发人员工具中,请求主体(有效负载)如下所示:
{
"filter" : {
"logic" : "and",
"filters" : [{
"field" : "name",
"value" : ""
}, {
"field" : "city",
"value" : ""
}, {
"field" : "zip",
"value" : ""
}, {
"field" : "country",
"value" : ""
}
]
}
}
在服务器端,我有一个用于该结构的 POJO。我在 Spring Web MVC Servlet 环境中成功测试了这一点。使用 @RequestBody 和 Jackson 可以对 JSON 对象进行反序列化。
在 liferay-portlet 环境中工作 我不能使用 @RequestBody 和 httpServletRequest。
控制器如下所示:
@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-Object(摘要):
public class DataSourceRequest {
private int page;
private int pageSize;
private int take;
private int skip;
private List<SortDescriptor> sort;
private List<GroupDescriptor> group;
private List<AggregateDescriptor> aggregate;
private HashMap<String, Object> data;
private FilterDescriptor filter;
public DataSourceRequest() {
filter = new FilterDescriptor();
data = new HashMap<String, Object>();
}
...(getters and setters)
public static class FilterDescriptor {
private String logic;
private List<FilterDescriptor> filters;
private String field;
private Object value;
private String operator;
private boolean ignoreCase = true;
public FilterDescriptor() {
filters = new ArrayList<FilterDescriptor>();
}
...(getters and setters)
几周以来我一直在寻找解决方案,但我没有使用 portlet-controller 将 JSON-Object 转换(反序列化?)为 DataSourceRequest-Object。我什至不知道如何从 portlet 控制器访问请求正文(有效负载)中的 JSON 字符串。
继第二个提到的帖子之后,嵌套对象可能是问题所在。我联系了 kendo-ui 支持人员,询问如何提交请求以获取帖子中描述的格式。但他们告诉我,这是不可能的(例如,使用数据源对象的参数映射属性),我必须在服务器端解决它。
第一篇文章描述了一个使用 @ModelAttribute 的解决方案,但是我只得到了空对象——当我尝试使用 @RequestParam 获取 JSON 时,我得到了一个错误,参数不在请求中(我认为是因为它在正文中)
我正在考虑设置一个基于 Spring Web MVC Servlet 的附加 RESTFul API - 我什至尝试过它并且它有效 - 但我不确定这是否真的有意义,因为 liferay 已经有一个 RESTFul -API。
有没有办法在 Portlet 控制器内将 JSON 对象转换为 JAVA 对象?或我需要额外的 API 吗?
欢迎任何提示!
【问题讨论】:
标签: java json kendo-ui liferay-6 spring-portlet-mvc