2017-07-20 1 views
1

J'utilise Jersey 2.xJersey définit la valeur de POJO à 0

Je suit classe POJO avec setters et getters.

public class AccountObject { 

private int accountNumber; 
private int accountStatus; 

//Getters and Setters 

} 

Ceci est ma signature de la méthode dans le contrôleur

@POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces("application/json") 
    public Response createAccount(AccountObject accountObject, @Context ContainerRequestContext requestContext) { 

// 

} 

J'appelle mon API avec le corps JSON vide

{} 

Problème est: Je reçois des valeurs AccountNumber et accoutStatus comme 0

J'ai écrit quelques val idation fonctionne pour vérifier accountNumber et accountStatus, donc à cause de ce comportement, ma fonction est bypassée.

Je suis incapable de comprendre comment les valeurs sont affectées à la valeur 0

+0

Voulez-vous que ce soit autre chose? – itsmichaelwang

+0

Je m'attendais à ce qu'il soit nul. puisque je ne l'ai pas fourni dans json –

+0

Vous ne pouvez pas avoir une primitive être nulle. Pouvez-vous essayer d'utiliser Integer au lieu de int? – itsmichaelwang

Répondre

1

Si vous voulez qu'il soit null, essayez d'utiliser Integer au lieu de int. Un int ne peut pas être null parce que c'est un type primitif, mais un Integer peut.

docs: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

+0

Monsieur Comment puis-je effectuer des vérifications null, par exemple: Si j'introduis 'email' dans mon POJO et que je n'ai pas passé' email' dans ma requête alors je le vérifie par 'String.valueOf (AccountDetails.getEmail) .equalsIgnoreCase ("null") '.Mais si je fais accountNumber comme Integer et essaye de vérifier si elle est nulle, alors elle lancera une exception de pointeur null. Fondamentalement, je veux valider si la clé est présente ou non dans la demande. Comment puis-je y parvenir? –

+0

Pourriez-vous faire 'AccountDetails.getEmail() == null'? – itsmichaelwang

+0

Oui, je peux, je viens de le vérifier. –

2

Cela n'a rien à voir avec Jersey, mais avec Core Java & règles Jackson.

Jersey utilise Jackson pour gérer comme mentionné support de liaison JSON basé POJOhere

donc vous devez comprendre comment fonctionne Jackson quand il reçoit et vide JSON comme ci-dessous,

import java.io.IOException; 

import com.fasterxml.jackson.core.JsonParseException; 
import com.fasterxml.jackson.databind.JsonMappingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 


public class App 
{ 
    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException 
    { 

     String JSON = "{}"; 

     ObjectMapper mapper = new ObjectMapper(); 

     AccountObject acObject = mapper.readValue(JSON, AccountObject.class); 

     System.out.println(acObject.getAccountNumber()+" :"+acObject.getAccountStatus()); 


    } 
} 

Vous verrez que Jackson crée AccountObject avec valeur par défaut comme valeur nulle (conformément aux règles Java de base), car il ne trouve aucune valeur dans Input JSON.

Si vous modifiez les types de champs en Integer, ces valeurs deviendront null conformément aux règles de champ par défaut de Core Java.

int n'est pas un type de référence, donc il ne peut pas être affecté à null.

Vous devez donc modifier votre POJO selon vos exigences de validation ou modifier votre logique de validation selon votre POJO.

Juste pour un souci d'exhaustivité, les dépendances comme ci-dessous,

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.8.9</version> 
    </dependency> 

    <dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.8.9</version> 
    </dependency>