JSON验证休息服务

时间:2013-04-04 20:42:42

标签: java rest java-ee jersey jackson

环境:Java,泽西与杰克逊,Tomcat。

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

例如 -

// REST SERVICE
    @POST
    @Path("login")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response login(Credentials login,
            @Context HttpServletRequest httpRequest) {


        if (login == null)
            // return sendBadRequest(HTTP 400);

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

        if (userName == null)
            // return sendBadRequest(HTTP 400);
        else if (passWord == null)
            // return sendBadRequest(HTTP 400);


    .....
}

// Credentials.java
@JsonIgnoreProperties(ignoreUnknown=true) 
public class Credentials {

    private String username;

    private String password;

// Getters and setters...
}

例如 - 像

 {"key" : "val" 
这样的非json输入应该生成HTTP 400.除了输入非正确值(如
 {"usernames" : "abc", "passwords" : "abc"}
)之外,还应生成HTTP 400.

我的代码适用于提到的案例2,但我预计它也适用于案例1。当非json输入存在时,我希望它将Credential对象设置为null,然后我可以将'if'中的null对象返回到HTTP 400.但事实并非如此。这个案例是否有其他框架提供的内容?

2 个答案:

答案 0 :(得分:1)

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

这是一个例子:


@Provider
public class JsonParseExceptionHandler implements
        ExceptionMapper {

    public Response toResponse(JsonParseException exception) {
        ResponseStatus status = new ResponseStatus();
        ClientResponse clientResponse = new ClientResponse();

        status.setCode(Status.BAD_REQUEST.getStatusCode());
        status.setMessage(Status.BAD_REQUEST.name());
        status.setFieldName("JSON Parsing Exception");
        status.setFieldDescription(exception.getMessage());

        clientResponse.setStatus(status);

        return Response
                .status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())
                .entity(clientResponse).build();
    }

}

答案 1 :(得分:-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)