4

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

Struts2 休息插件

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

struts.rest.content.restrictToGET = false

这个问题得到。 我仍然收到此错误

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>

这服务于所有请求GET, POST, PUT, UPDATE

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

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

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 请求,我会发布请求,例如 在此处输入图像描述

你可以看到我得到的回应。我为post写的方法上面写着name create。我在正文中确实有数据,并且我确实在 create 方法中完美地获取了数据。

现在在帖子中,正如我在多个示例中看到的那样

struts-rest , stuts2-rest-sample , struts2-rest-shopping-list

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

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

经过一些调试后,我发现DefaultContentTypeHandlerManager在 struts2-rest-plugin 中考虑xhtml中将其视为默认模板。虽然它应该是 XML 或 JSON。

我想回来

 code : 1xx,2xx,4xx
 message: Success, Fail

在接受 POST 请求时使用 XML 或 JSON 格式。

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

4

2 回答 2

2

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

内容类型

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

  • HTML
  • XML
  • JSON

这里没有任何配置,只需将内容类型扩展添加到您的 RESTful URL 即可。该框架将负责其余的工作。因此,例如,假设一个名为 Movies 的控制器和一个带有 idof的电影superman,以下 URL 将全部命中

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. 在上面添加一个常量后,您可以使用一些 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"}
于 2017-10-07T21:07:58.557 回答
0

So here is the solution which I needed. What I did is

@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;
}

and then in content type handler. Content-Type handler is custom as I have used Jackson for conversion from JSON to object and vice versa.

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));
} 
于 2018-02-28T12:13:43.450 回答