gpt4 book ai didi

java - 使用@ResourceMapping 和@ModelAttribute 在 Spring Portlet Controller 中访问 RequestBody

转载 作者:行者123 更新时间:2023-11-29 08:32:48 24 4
gpt4 key购买 nike

我的问题类似于以下帖子: JSON ajax POST to Spring Portlet Controller @ResourceMapping conversion issue@ResourceMapping that accepts JSON from Ajax request

我在那里尝试过 Tipps,但没有成功。我有以下技术:

  1. liferay-portal 6.2 CE
  2. 基于 spring 3.0.7 的 liferay 自定义 portlet-plugin
  3. jsp 剑道用户界面

在客户端,我生成了一个字符串化的 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 环境中成功测试了它。使用 @RequestBodyJackson 可以对 JSON 对象进行反序列化。

liferay-portlet 环境 中工作我不能使用@RequestBodyhttpServletRequest

Controller 如下所示:

@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 对象(摘要):

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 对象转换(反序列化?)为 DataSourceRequest 对象。我什至不知道如何从 portlet Controller 访问请求正文(有效负载)中的 JSON 字符串。

第二个提到的帖子之后,嵌套对象可能是问题所在。我联系了 kendo-ui 支持问题,如何提交请求以获取帖子中描述的格式。但他们告诉我,这是不可能的(例如,使用数据源对象的参数映射属性),我必须在服务器端解决它。

第一篇文章描述了一个使用@ModelAttribute的解决方案,但后来我只得到了空对象——当我尝试使用@RequestParam 获取 JSON 时,我得到了一个错误,参数不在请求中(我认为是因为它在正文中)

我正在考虑建立一个基于 Spring Web MVC Servlet 的附加 RESTFul API - 我什至尝试过它并且它有效 - 但我不确定这是否真的有意义,因为 liferay 已经有一个 RESTFul -API。

有没有办法在 Portlet Controller 内将 JSON 对象转换为 JAVA 对象?或者我需要额外的 API 吗?

欢迎任何提示!

最佳答案

我在使用 Liferay 序列化和反序列化 Json 时遇到了同样的问题。我的解决方案是将 json 作为参数发送到表单数据中。这样我就可以使用以下方法检索 Json:

String paramJson = ParamUtil.getString(request, "myJson");

然后利用Gson反序列化的api:

new Gson().fromJson(paramJson, MyPOJO.class);

使用 Gson 不会有那么多麻烦。您还可以使用 Gson 在返回的服务中序列化对象,这将避免 Liferay 无法正确序列化嵌套对象的问题。

此代码显示如何将 Json 作为请求正文发送:

请求将由 MVCPortlet 中的“serveResource”方法处理。

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);

关于java - 使用@ResourceMapping 和@ModelAttribute 在 Spring Portlet Controller 中访问 RequestBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46567570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com