我已经从这里获取信息实现了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请求。我可以将xml或json作为默认模板,但我不希望因为它会影响非restful请求。)
答案 0 :(得分:1)
您误解了与struts2-rest-plugin一起使用的内容类型的概念。
Content Types
除了提供RESTful URL到Controller的映射( Action)调用,REST插件也提供了 产生资源数据的多个表示。默认情况下 插件可以返回以下内容类型的资源:
- HTML
- XML
- JSON
这里没有配置,只需添加内容类型扩展名 到您的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));
}