2013-04-04 209 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