[英]How to return HTTP error status code *and* content in Struts2
我有一个接收 http 文件上传并以 JSON 确认响应的控制器。 如果上传处理有任何问题,我想返回一个 HTTP 错误状态代码(例如 403 表示格式错误的请求或 500 表示一般处理错误),但我也想发送详细错误的 JSON 列表消息。 我知道如何返回 500 错误(感谢这篇文章),但我不知道如何返回 500 代码并仍然发送内容。
这是我的代码的一个片段(它没有做我想要的):
@Action(value = "upload", results = {
@Result(name = SUCCESS, type = "freemarker", location = "results.ftl", params = { "contentType", "text/plain" }),
@Result(name = ERROR, type = "freemarker", location = "error.ftl", params = { "contentType", "text/plain" }),
@Result(name = ERROR, type = "httpheader", params = { "status", "500" })
})
public String upload() {
//do stuff
if(CollectionUtils.isEmpty(getActionErrors()) {
return SUCCESS;
} else {
return ERROR;
}
}
这是一篇旧帖子,但如果您使用的是我建议使用的 Struts-JSON,您可以简单地返回一个包含您想要的错误对象并附加如下状态代码:
@Result(name = ERROR, type="json",
params = {"root","errorResponse", "statusCode", "500"}
)
2015 年 2 月 24 日更新: ty-danielson 的答案是正确的。 它适用于 JSON 响应,这是我想要的,即使我使用 freemarker 模板来生成它们(另一个坏主意)。
如果您真的想要一个带有错误状态代码的 freemarker 模板:我的原始答案仍然是错误的方法,因为从操作方法内部访问 ServletResponse 是一种错误的形式。 Struts 的内置 FreemarkerResult 不接受状态代码参数,但您可以通过对其进行子类化来轻松添加此功能(示例来自GBIF 项目)
/**
* Same as FreemarkerResult, but with added 'statusCode' parameter.
* (don't forget to register this result type in struts-config.xml)
*/
public class FreemarkerHttpResult extends FreemarkerResult {
private int status;
public int getStatusCode() {
return status;
}
public void setStatusCode(int status) {
this.status = status;
}
@Override
protected void postTemplateProcess(Template template, TemplateModel data) throws IOException {
super.postTemplateProcess(template, data);
if (status >= 100 && status < 600) {
HttpServletResponse response = ServletActionContext.getResponse();
response.setStatus(status);
}
}
}
然后像这样声明你的动作映射:
@Action(value = "myAction", results = {
@Result(name = SUCCESS, type = "freemarker", location = "results.ftl"),
@Result(name = ERROR, type = "freemarkerhttp", location = "error.ftl", params = { "statusCode", "500"})
})
public String myAction() {
//do stuff, then return SUCCESS or ERROR
}
所以,我不确定从 struts2 的角度来看这是否“正确”,但这里有一个解决方案,它实现了我返回 http 错误代码的目标,同时仍然能够呈现 freemarker 模板。 我会将此标记为答案,直到出现更好的答案。
@Action(value = "upload", results = {
@Result(name = SUCCESS, type = "freemarker", location = "results.ftl", params = { "contentType", "text/plain"}),
@Result(name = ERROR, type = "freemarker", location = "error.ftl", params = { "contentType", "text/plain"})
})
public String upload() {
try {
//do stuff
} Catch(SomeExceptionType ex) {
addActionError("you did something bad");
HttpServletResponse response = ServletActionContext.getResponse();
response.setStatus(400);
}
}
如果有人正在寻找已接受答案的struts.xml版本,我将把它留在这里:
<action name="upload"
class="...">
<exception-mapping exception="java.lang.Exception" result="error"/>
<result name="error" type="json">
<param name="statusCode">418</param>
</result>
<result name="Success" type="json" />
</action>
我没有时间设置测试 Struts2 应用程序,但可能只有一个错误结果:
@Result(name = ERROR, type = "freemarker", location = "error.ftl",
params = { "contentType", "text/plain", "status", "500" })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.