2013-04-04 356 views
0

环境:Java,Jersey与Jackson,Tomcat。JSON验证休息服务

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

对于示例 -

 
// 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'中的空对象返回HTTP 400.但事实并非如此。框架为这种情况提供了什么?

回答

1

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

下面是这样一个例子:约GSON位,我不使用,这里

 

@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

您可以使用GSON你JSON转换成Java对象,那么你可以验证

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

或者您可以使用JSON库

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

下面的方法将有助于

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

+0

我知道。我想用Java Jersey框架来处理异常,而不是我的代码,我比较字符串。感谢您的建议,但那不是我想要的 – AnujKu 2013-04-04 22:16:09