我从这里获取信息实现了Struts2 REST API
有没有办法在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>
这服务所有请求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);
}
这是返回类型为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.xml
,http://localhost:8080/restdemoapplication/restdemo.json
你可以看到我得到的回应。我为帖子写的方法在上面写着名字create。我确实有正文中的数据,我确实在create方法中获得了数据。
现在在帖子中,我已经在多个例子中看到过像
我不想像这些应用程序那样返回对post请求的响应。我想返回自己的回复,它将是状态代码和这样的消息
<?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>
经过一些调试后,我发现struts2-rest-plugin中的DefaultContentTypeHandlerManager
将xhtml
视为默认模板。虽然它应该是XML或JSON。
我想回来
code : 1xx,2xx,4xx
message: Success, Fail
在接受POST请求时,使用XML或JSON格式。
(这是应用程序招待非restful请求和restful请求。我可以将xml或json作为默认模板,但我不希望因为它会影响非restful请求。)
您误解了与struts2-rest-plugin一起使用的内容类型的概念。
Content Types
除了提供RESTful URL到Controller(Action)调用的映射之外,REST插件还提供了生成资源数据的多个表示的能力。默认情况下,插件可以返回以下内容类型中的资源:
- HTML
- XML
- JSON
这里没有配置,只需将内容类型扩展添加到RESTful URL。该框架将负责其余部分。因此,例如,假设一个名为Movies的控制器和一个
id
为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"
头定义。
要使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"}
所以这是我需要的解决方案。我做的是
@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));
}