Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@ResourceMapping和@ModelAttribute访问SpringPortlet控制器内的RequestBody_Java_Json_Kendo Ui_Liferay 6_Spring Portlet Mvc - Fatal编程技术网

Java 使用@ResourceMapping和@ModelAttribute访问SpringPortlet控制器内的RequestBody

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" :

我的问题与以下帖子类似: 及

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

  • liferay portal 6.2 CE
  • 基于spring 3.0.7的liferay自定义portlet插件
  • jsp的剑道用户界面
  • 在客户端,我生成了一个字符串化的json对象,该对象具有KendoUIforJSP的功能,并在请求主体中提交。目前它只包含一些过滤器参数(但也可以包含服务器端分页、排序、分组等的其他参数)

    在Firefox开发者工具中,请求主体(有效负载)如下所示:

    {
    "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环境中成功地测试了这一点。使用@RequestBodyJackson可以反序列化JSON对象

    liferay portlet环境中工作我无法使用@RequestBodyhttpServletRequest

    控制器如下所示:

    {
    "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分享我的经验,请执行以下步骤:

  • 在JS中,将contentType设置为应用程序/x-www-form-urlencoded。这是剑道ui的代码(在后台使用jQuery Ajax)

  • 与@giovani不同,我不需要提交portlet名称空间。要实现这一点,您必须将以下配置添加到liferayportlet.xml

    <requires-namespaced-parameters>false</requires-namespaced-parameters>
    
    false
    
    要与hera分享我的经验,请执行以下步骤:

  • 在JS中,将contentType设置为appli