Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Struts2中返回HTTP错误状态代码*和*内容_Java_Struts2 - Fatal编程技术网

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

Java 如何在Struts2中返回HTTP错误状态代码*和*内容,java,struts2,Java,Struts2,我有一个控制器,它接收http文件上传并用JSON确认响应。如果上传过程中出现任何问题,我希望返回HTTP错误状态代码(例如,403表示格式错误的请求,500表示一般处理错误),但我还希望发送详细错误消息的JSON列表。我知道如何返回500错误(感谢),但我不知道如何返回500代码并仍然发送内容 以下是我的代码片段(它没有达到我想要的效果): 我没有时间设置test Struts2应用程序,但可能有一个错误结果: @Result(name = ERROR, type = "freemarker"

我有一个控制器,它接收http文件上传并用JSON确认响应。如果上传过程中出现任何问题,我希望返回HTTP错误状态代码(例如,403表示格式错误的请求,500表示一般处理错误),但我还希望发送详细错误消息的JSON列表。我知道如何返回500错误(感谢),但我不知道如何返回500代码并仍然发送内容

以下是我的代码片段(它没有达到我想要的效果):


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

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

更新2/24/15:是正确的。它适用于JSON响应,这是我想要的,即使我使用freemarker模板生成它们(另一个坏主意)

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

我最初的答案 因此,我不确定从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 JSON(我建议使用),您只需返回一个包含所需内容的错误对象,并附加如下状态代码:

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

如果有人正在寻找公认答案的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>

418

你为什么要这么做?我想你的客户很有可能会在看到500标题时忽略任何内容。500意味着发生了灾难性事件,导致响应无法完成。如果你发现了错误并且能够描述它们,那么500不是正确的回答。此外,如果您的客户机正在解析json响应,那么为什么首先需要一个500头呢。基本上,我使用的是一个jquery插件,它将发送文件(如果支持文件附件,则通过XHR发送,否则通过隐藏的iframe发送)。除了成功回调之外,还可以注册错误回调(如果服务器返回错误状态代码,则调用)。还有其他选择,但注册错误回调是我更喜欢的。嗯。。。不走运。控件被传递到my error.ftl,但状态代码仍然是200。我也发现这是实现非200状态的唯一方法。从Struts 2.3.16开始,注释中的“status”参数似乎没有任何作用。虽然我的答案有效,但我知道这不是一个好主意。如果您正在提供json,请查看ty的答案。我还更新了我的答案,包括如何向freemarker结果中添加statusCode参数的说明。这比我的方法要好得多。将此更新为“正确”解决方案(抱歉延迟)。
@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);
       }


    }
@Result(name = ERROR, type="json", 
        params = {"root","errorResponse", "statusCode", "500"}
)   
    <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>