2013-04-04 4 views
0

Enviorment: Java, Jersey avec Jackson, Tomcat.Service de repos JSON Verification

J'ai un service de repos prenant l'entrée JSON du client. Je veux vérifier l'entrée, si son JSON ou pas et ensuite JSON puis la clé dans l'entrée JSON est comme prévu ou non. Si oui alors il devrait produire une requête HTTP 400-Bad.

Pour exemple-

 
// 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... 
} 

Par exemple - entrée non JSON comme

 {"key" : "val"
devrait produire HTTP 400. Outre l'entrée avec des valeurs non appropriées comme
 {"usernames" : "abc", "passwords" : "abc"}
devrait produire HTTP 400.

Mon code fonctionne bien pour le cas 2 mentionné mais je m'attendais à ce qu'il fonctionne aussi pour le cas 1. quand l'entrée non-json est là, je m'attendais à ce qu'elle mette à zéro l'objet Credential et que je puisse l'objet nul dans 'if' pour renvoyer le HTTP 400. Mais ce n'était pas le cas. Y a-t-il quelque chose que le cadre de repos prévoit pour ce cas?

Répondre

1

Après une longue recherche, j'ai réussi à trouver la réponse à cette question. Nous devons utiliser @Provider dans le cadre de repos pour gérer cette erreur.

Voici un exemple pour cela:

 

@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

Vous pouvez utiliser gson pour vous convertir JSON en objet java, vous pouvez valider

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

Ou vous pouvez utiliser JSON Lib

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

La méthode suivante vous aidera

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

+0

Je sais peu GSON Je n'utilise pas ici. Je voulais utiliser le framework Java Jersey pour gérer l'exception et pas mon code où je compare les chaînes. Merci votre suggestion mais ce n'est pas ce que je voulais – AnujKu