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

问题描述 投票:2回答:2

我从这里获取信息实现了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请求和restful请求。我可以将xml或json作为默认模板,但我不希望因为它会影响非restful请求。)

java struts2 struts2-rest-plugin
2个回答
1
投票

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

Content Types

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

  • HTML
  • XML
  • JSON

这里没有配置,只需将内容类型扩展添加到RESTful URL。该框架将负责其余部分。因此,例如,假设一个名为Movies的控制器和一个idsuperman的电影,以下网址将全部命中

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"头定义。

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

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

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

POST http://localhost:8080/orders
Accept: application/json
Content-Type: application/json
{
  "id":"23423423",
  "clientName":"Roman C",
  "amount": 1000
}
 -- response --
201 
Content-Language:  en-US
Content-Length:  54
Content-Type:  application/json;charset=UTF-8
Date:  Sat, 07 Oct 2017 20:44:39 GMT
ETag:  -735433458
Location:  http://localhost:8080/orders/23423423

{"amount":1000,"clientName":"Roman C","id":"23423423"}

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));
} 
© www.soinside.com 2019 - 2024. All rights reserved.