Моя проблема аналогична следующим сообщениям: JSON ajax POST в Spring Portlet Controller @ResourceMapping проблема преобразования и @ResourceMapping, который принимает JSON из запроса Ajax
Я пробовал Tipps там, но безуспешно. У меня есть следующие технологии:
- liferay-портал 6.2 CE
- пользовательский портлет-плагин для liferay на основе весны 3.0.7
- кендо-интерфейс для JSP
На стороне клиента я создаю строковый json-объект с функциональностью kendo-ui для jsp, который отправляется в теле запроса. В настоящее время он содержит только некоторые параметры фильтра (но также может содержать дополнительные параметры для пейджинга на стороне сервера, сортировки, группировки и т. д.).
В инструментах разработчика 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 не имеет значений. Я вижу все атрибуты, но они пусты. И нет параметра запроса "фильтр" (как и ожидалось)
Вот мой объект 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)
Я ищу решение уже несколько недель, но не могу преобразовать JSON-Object (десериализовать?) в DataSourceRequest-Object с помощью контроллера портлета. Я даже понятия не имею, как получить доступ к JSON-String в теле запроса (полезной нагрузке) из портлета-контроллера.
После второго упомянутого сообщения проблема может заключаться в вложенных объектах. Я обратился в поддержку кендо-уи с вопросом, как я могу отправить запрос, чтобы получить формат, описанный в посте. Но они сказали мне, что это невозможно (например, с использованием атрибута parameterMap объекта источника данных), и я должен решить это на стороне сервера.
Первое сообщение описывает решение с помощью @ModelAttribute, но затем я получаю только пустой объект, и когда я пытаюсь получить JSON с помощью @RequestParam, я получаю сообщение об ошибке, что параметра нет в запросе (думаю потому что он в теле)
Я думал о настройке дополнительного RESTFul API на основе сервлета Spring Web MVC — я даже попробовал его, и он работает, но я не уверен, что это действительно имеет смысл, потому что у liferay уже есть RESTFul -АПИ.
Есть ли способ преобразовать объект JSON в объект JAVA внутри контроллера портлета? или нужен ли мне дополнительный API?
Любые советы приветствуются!!