0

环境:Java,Jersey with Jackson,Tomcat。

我有一个从客户端获取 JSON 输入的休息服务。我想验证输入,如果它是 JSON,然后是 JSON,那么 JSON 输入中的键是否符合预期。如果是,那么它应该产生 HTTP 400-Bad 请求。

例如-

// 休息服务
    @邮政
    @Path("登录")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    公共响应登录(凭据登录,
            @Context HttpServletRequest httpRequest) {


        如果(登录 == 空)
            // 返回 sendBadRequest(HTTP 400);

        String userName = (String) login.getUsername();
        String passWord = (String) login.getPassword();

        如果(用户名 == 空)
            // 返回 sendBadRequest(HTTP 400);
        else if (passWord == null)
            // 返回 sendBadRequest(HTTP 400);


    ......
}

// 凭据.java
@JsonIgnoreProperties(ignoreUnknown=true)
公共类凭证{

    私人字符串用户名;

    私人字符串密码;

// getter 和 setter...
}

例如 - 非 json 输入,如

{“键”:“值”
应该产生 HTTP 400。以及带有不正确值的输入,例如
{“用户名”:“abc”,“密码”:“abc”}
应该产生 HTTP 400。

我的代码适用于提到的案例 2,但我希望它也适用于案例 1。当存在非 json 输入时,我希望它将 Credential 对象设置为 null,然后我可以将“if”中的 null 对象返回 HTTP 400。但事实并非如此。休息框架是否为这种情况提供了什么?

4

2 回答 2

1

经过长时间的研究,我设法找到了答案。我们必须在 rest 框架中使用 @Provider 来处理这个错误。

这是一个例子:

@Provider
公共类 JsonParseExceptionHandler 实现
        异常映射器 {

    公共响应到响应(JsonParseException 异常){
        ResponseStatus 状态 = 新的 ResponseStatus();
        客户端响应客户端响应 = 新客户端响应();

        status.setCode(Status.BAD_REQUEST.getStatusCode());
        status.setMessage(Status.BAD_REQUEST.name());
        status.setFieldName("JSON 解析异常");
        status.setFieldDescription(exception.getMessage());

        clientResponse.setStatus(status);

        返回响应
                .status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())
                .entity(clientResponse).build();
    }

}

于 2013-04-08T21:21:19.887 回答
-1

您可以使用 gson 将您的 JSON 转换为 java 对象,然后您可以验证

https://code.google.com/p/google-gson/

或者你可以使用 Json Lib

http://json-lib.sourceforge.net/index.html

以下方法会有所帮助

http://json-lib.sourceforge.net/apidocs/jdk15/net/sf/json/util/JSONUtils.html#mayBeJSON(java.lang.String)

于 2013-04-04T21:50:02.537 回答