如何在Struts2中返回HTTP错误状态代码*和*内容

时间:2011-05-05 22:28:13

标签: java struts2

我有一个接收http文件上传的Controller,并以JSON确认响应。如果上传的过程存在任何问题,我想返回一个HTTP错误状态代码(例如403表示格式错误的请求,或500表示一般处理错误),但我也想发送一个详细错误的JSON列表消息。我知道如何返回500错误(感谢this post),但我不知道如何返回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;
  }
}

4 个答案:

答案 0 :(得分:3)

这是一篇旧帖子,但如果您使用我建议使用的Struts-JSON,您可以简单地返回一个错误对象,并附上如下所示的状态代码:

@Result(name = ERROR, type="json", 
        params = {"root","errorResponse", "statusCode", "500"}
)   

答案 1 :(得分:2)

2015年2月24日更新ty-danielson's answer是正确的。它适用于JSON响应,这是我想要的,即使我使用freemarker模板生成它们(另一个坏主意)。

如果你真的想要一个带有错误状态代码的freemarker模板:我原来的答案是仍然错误的方法,因为从动作方法中访问ServletResponse是不好的形式。 Struts的内置FreemarkerResult不接受状态代码参数,但您可以通过子类化来轻松添加此功能(示例来自GBIF project

/** 
 * 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错误代码,同时仍然能够呈现自由标记模板。我会将此标记为答案,直到出现更好的答案。

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


    }

答案 2 :(得分:1)

如果有人正在寻找接受答案的 struts.xml 版本,我将其留在这里:

{{1}}

答案 3 :(得分:-1)

我没有时间设置测试Struts2应用程序,但可能只有一个错误结果:

@Result(name = ERROR, type = "freemarker", location = "error.ftl",
    params = { "contentType", "text/plain", "status", "500" })