Java 在Struts2 RESTful插件POST请求中返回响应
我从这里获取信息,实现了Struts2 REST API 在Struts2的restful插件中是否有返回自定义响应的方法。 我做了所有必要的修改,比如Java 在Struts2 RESTful插件POST请求中返回响应,java,struts2,struts2-rest-plugin,Java,Struts2,Struts2 Rest Plugin,我从这里获取信息,实现了Struts2 REST API 在Struts2的restful插件中是否有返回自定义响应的方法。 我做了所有必要的修改,比如 struts.rest.content.restrictToGET=false 从 但我还是犯了这个错误 No result defined for action `com.web.Controller.RestDemoController` and result create, 如果我不添加上面的行,我仍然会得到相同的响应 这是我在s
struts.rest.content.restrictToGET=false
从
但我还是犯了这个错误
No result defined for action `com.web.Controller.RestDemoController` and result create,
如果我不添加上面的行,我仍然会得到相同的响应
这是我在struts.xml
中提供的操作:
<constant name="struts.rest.content.restrictToGET" value="false"/>
你可以看到我得到的回应。我为post编写的方法写在上面,名为create。我确实在主体中有数据,并且我确实在create方法中完美地获得了数据
正如我在多个例子中看到的,现在在帖子中
,
我不想像这些应用程序那样返回post请求的响应。我想返回我自己的响应,它将是一个状态码和一条类似这样的消息
<?xml version="1.0" encoding="UTF-8"?> <Status><code>200</code><message>Success</message></Status>
在调试之后,在Struts2 REST插件中发现<代码> Debug TraceType HANDLILE管理器< /代码>考虑<代码> XHTML<代码>作为默认模板。而它应该是XML或JSON
我想回去
code : 1xx,2xx,4xx
message: Success, Fail
在接受POST请求时使用XML或JSON
(这是一个既能处理非restful请求又能处理restful请求的应用程序。我可以将xml或json作为默认模板,但我不希望这样做,因为这会影响非restful请求。)您误解了struts2 rest插件使用的内容类型的概念
除了提供RESTful URL到控制器的映射之外(
操作)调用时,REST插件还提供
生成资源数据的多个表示形式。默认情况下
插件可以返回以下内容类型的资源:
- HTML
- XML
- JSON
这里没有任何配置,只需添加内容类型扩展
到您的RESTful URL。框架将处理其余部分。那么,为了
实例,假设一个名为Movies的控制器和一个具有
id
的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
和注册
他们用这个系统
插件服务器按内容类型请求,要么作为操作扩展提供,要么提供数据类型。传入数据类型由“内容类型”
标题定义,传出数据类型由“接受”
标题定义
要使POST
请求返回数据,您需要在Struts配置文件Struts.xml
中添加一个常量:
<constant name="struts.rest.content.restrictToGET" value="false"/>
这就是我需要的解决方案。我所做的是
@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;
}
这不清楚您为什么需要重写ContentTypeHandlerManager
,它对您没有帮助。链接是绝对没有你的问题。我将把这个话题划掉,没有人有兴趣深入研究Struts2的内部结构,如果有的话,没有明确的问题陈述,没有代码,询问XY问题。@Roman C如果你看到顶部,我特别说我想要一个自定义响应发送给客户端。它可以是xml或json。在那之后,你会看到当我做一个post请求时,我会得到什么样的响应。请您说明您需要什么样的更多信息才能使这个问题更适合。我已经提供了post请求调用的代码,并且我还提供了post请求后的结果,该结果高于代码。没有为操作定义的结果意味着Struts无法找到操作的结果。在进一步挖掘之前,请尝试修复此问题。@AleksandrM我们真的需要struts2中rest api的结果吗?它不应该返回一个成功或失败的响应吗?我按照文件所说的做了。当我发送像or.json这样的请求时,它会相应地返回数据,我唯一找不到的是,我想返回我的自定义响应,而不是像在struts2 rest showcase中那样重定向它。我已经更新了问题SIT通过重定向并在httpheaders中提供位置id来返回post响应,我不想这样做,简单的说,我想直接返回一些自定义消息,而不是重定向。它在响应中返回location
头,但它没有重定向,请参阅返回的状态代码。明白了,但不知何故,在位置上,您给出了URI。我不想这样做。我只想返回一条消息,您可以通过向操作添加属性来返回该消息。
@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;
}
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));
}