如何使用Struts框架构造自定义错误json响应

时间:2014-11-10 12:35:25

标签: java json struts2 actionresult

我正在使用struts创建一个Web应用程序。我想在请求URL格式不正确时发出错误的JSON响应,如下所示

{
  “status”: 409,
  "code": 40924
  “property”: “aggregation”,
  “message”: “aggregationId not specified.”,
  “moreInfo”: “https://www.iiitb-swn.com/docs/api/errors/40924”
} 

我已经使用struts2-json插件使用JSON序列化响应对象。我该如何发送JSON错误响应。我可以想到以下做同样的方式。

在操作类中使用错误响应对象并明确设置所有名称所需的名称值对

private Map<String, String> errorObject;

public String execute()
{
    ...
    if (aggregationId == -1)
    {
        errorObject = new HashMap<>();
        errorObject.put("status", "400");
        errorObject.put("code", "40924");
        ...
        return INPUT;
    }
    ...
}

然后,我可以处理仅errorObject中的struts.xml序列化。

我是Struts的新手,并想知道是否有一种既定的方法可以做到这一点?或许可以更好地使用Struts框架。

2 个答案:

答案 0 :(得分:3)

actionErrors提供的Struts2 fieldErrorsActionSupport。您可以填写操作错误,或者它们由验证拦截器生成。例如

addFieldError("aggregation", “aggregationId not specified.”);
addFieldError("moreInfo", “https://www.iiitb-swn.com/docs/api/errors/40924”);

然后返回json结果作为回复。

<result name="input" type="json">
  <param name="statusCode">409</param>
  <param name="errorCode">40924</param>
  <param name="ignoreHierarchy">false</param>
  <param name="includeProperties">^actionErrors.*,^fieldErrors.*</param>
</result> 

答案 1 :(得分:1)

在这种情况下,我更喜欢添加&#34; fieldErrors&#34; property作为结果的根对象,而不是使用正则表达式进行过滤。

因此,我将此添加到操作配置(在本例中为注释)

@Result(name="input", type="json", params={"root","fieldErrors"})

在ajax配置中,在成功结果下,我使用返回的JSON作为

success : function(fieldErrors, textStatus, jqXHR) {
        for (var property in fieldErrors) {
            if (fieldErrors.hasOwnProperty(property)) {
                var this_field_err = fieldErrors[property];
                $('#submit_result').append(property+" error");
                for(var ix=0; ix<this_field_err.length; ix++) {
                    $('#submit_result').append(this_field_err[ix]);
                    $('#submit_result').append("<br>"); 
                }
            }
        }
    }

这会增加#submit_result div我有页面

username error: Username must be at least 6 charachers long
password error: Password msut be at least 8 charachers long