在Struts2 RESTful插件POST请求中返回响应

时间:2017-10-06 08:07:17

标签: java struts2 struts2-rest-plugin

我已经从这里获取信息实现了Struts2 REST API

  

Struts2 Rest Plugin

有没有办法在Struts2的restful插件中返回自定义响应。 我做了所有必要的更改,如

struts.rest.content.restrictToGET = false

来自 This Question. 我仍然收到此错误

No result defined for action `com.web.Controller.RestDemoController` and result create, 

如果我不添加以上行,我仍会得到相同的回复。

这是我在struts.xml中提供的操作:

<action name="restdemo" class="com.web.Controller.RestDemoController">
    <interceptor-ref name="customRestStack"></interceptor-ref>
</action>

这适用于所有请求GETPOSTPUTUPDATE

将post方法的返回类型从HttpHeader更改为String后,我仍然得到相同的错误

Error 404: No result defined for action com.web.Controller.RestDemoController and result <?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>

这是我为POST编写的代码:

public HttpHeaders create(){
    System.out.println(envision2Data.toString());
    return new DefaultHttpHeaders("create").withStatus(200);
}

这是返回类型为String的POST请求方法:

public String create(){
    System.out.println(envision2Data.toString());
    return "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <Status><code>200</code><message>Success</message></Status>";
}

我得到了完美的响应,如果我发送xml或json请求,我会根据扩展名得到xml和json。 例如http://localhost:8080/restdemoapplication/restdemo.xmlhttp://localhost:8080/restdemoapplication/restdemo.json

对于POST请求我发帖请求就像 enter image description here

你可以看到我得到的回应。我为帖子写的方法在上面写着名字create。我确实有正文中的数据,我确实在create方法中获得了数据。

现在正在帖子中,我已经在多个例子中看到了像

  

struts-reststuts2-rest-samplestruts2-rest-shopping-list

我不想像这些应用程序那样返回post请求的响应。我想返回我自己的回复,它将是一个状态代码和这样的消息

<?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>

经过一些调试后,我发现struts2-rest-plugin中的DefaultContentTypeHandlerManagerxhtml视为默认模板。虽然它应该是XML或JSON。

我想返回

 code : 1xx,2xx,4xx
 message: Success, Fail
当接受POST请求时,在

中使用XML或JSON。

(这是应用程序同时接受非平静请求和restful请求。我可以将xml或json作为默认模板,但我不希望因为它会影响非restful请求。)

2 个答案:

答案 0 :(得分:1)

您误解了与struts2-rest-plugin一起使用的内容类型的概念。

  

Content Types

     

除了提供RESTful URL到Controller的映射(   Action)调用,REST插件也提供了   产生资源数据的多个表示。默认情况下   插件可以返回以下内容类型的资源:

     
      
  • HTML
  •   
  • XML
  •   
  • JS​​ON
  •   
     

这里没有配置,只需添加内容类型扩展名   到您的RESTful URL 。该框架将负责其余部分。因此对于   例如,假设一个名为Movies的Controller和一个带有的电影   id的{​​{1}},以下网址将全部点击

superman
     

请注意,这些内容类型作为传入数据类型受支持   好。而且,如果需要,您可以通过编写扩展功能   你自己的实现   http://my.company.com/myapp/movies/superman http://my.company.com/myapp/movies/superman.xml http://my.company.com/myapp/movies/superman.xhtml http://my.company.com/myapp/movies/superman.json 并注册   他们与系统。

插件服务器按内容类型请求,提供为操作扩展或提供数据类型。传入数据类型由org.apache.struts2.rest.handler.ContentTypeHandler标头定义,传出数据类型由"Content-Type"标头定义。

要使"Accept"请求返回数据,您需要向Struts配置文件POST添加一个常量:

struts.xml

Demo应用程序随着名为struts2-rest-showcase的Struts发行版一起提供。添加上面的常量后,您可以使用一些http客户端测试应用程序。

<constant name="struts.rest.content.restrictToGET" value="false"/>

答案 1 :(得分:0)

所以这是我需要的解决方案。我做的是

@Override
public Object getModel() {
        <!-- Changed name of the object overhere to mainObject-->
    if (mainObject == null) {
        if (responseObject != null) {
            return responseObject;
        } else if (mainObject != null) {
            return mainObject;
        }
        mainObject = new mainObject();
    }
    return mainObject;
}

然后在内容类型处理程序中。 Content-Type处理程序是自定义的,因为我使用Jackson将JSON转换为对象,反之亦然。

if (paramObject instanceof MainObject) {
        MainObject mainObject = (MainObject) paramObject;
        writer.write(mapper.writeValueAsString(mainObject));
} else if (paramObject instanceof ResponseObject) {
        ResponseObject responeObject = (ResponseObject) paramObject;
        writer.write(mapper.writeValueAsString(responeObject));
}