环境: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.但事实并非如此。这个案例是否有其他框架提供的内容?
答案 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
以下方法有助于