web-dev-qa-db-fra.com

Spring Boot Automatic JSON to Object at Controller

J'ai une application SpringBoot avec ces dépendances:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

J'ai une méthode sur mon contrôleur comme suit:

@RequestMapping(value = "/liamo", method = RequestMethod.POST)
@ResponseBody
public XResponse liamo(XRequest xRequest) {
    ...
    return something;
}

J'envoie un objet JSON à partir de mon HTML via AJAX avec certains champs d'objet de type XRequest (c'est un POJO ordinaire sans aucune annotation). Cependant, mon JSON n'est pas construit en objet à la méthode de mon contrôleur et ses champs sont nuls.

Qu'est-ce qui me manque pour une désérialisation automatique sur mon contrôleur?

10
kamaci

Spring boot est livré avec Jackson prêt à l'emploi qui se chargera de désorganiser le corps de la requête JSON pour Java objets

Vous pouvez utiliser l'annotation @RequestBody Spring MVC pour désérialiser/désorganiser la chaîne JSON en Java ... Par exemple.

Exemple

@RestController
public class CustomerController {
    //@Autowired CustomerService customerService;

    @RequestMapping(path="/customers", method= RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public Customer postCustomer(@RequestBody Customer customer){
        //return customerService.createCustomer(customer);
    }
}

Annotez les éléments membres de vos entités avec @JsonProperty avec les noms de champs json correspondants.

public class Customer {
    @JsonProperty("customer_id")
    private long customerId;
    @JsonProperty("first_name")
    private String firstName;
    @JsonProperty("last_name")
    private String lastName;
    @JsonProperty("town")
    private String town;
}
16
so-random-dude

SpringBoot est fourni par défaut avec cette fonctionnalité. Il vous suffit d'utiliser @RequestBody annotation dans la déclaration des paramètres de la méthode de votre contrôleur mais contrairement à @ so-random-dude's answer vous n'avez pas à annoter les champs avec @JsonProperty, ce n'est pas obligatoire.

Il vous suffit de fournir des getters et setters pour votre classe d'objets XML personnalisée. Je poste un exemple ci-dessous pour plus de simplicité.

Exemple:

Déclaration de la méthode du contrôleur: -

@PostMapping("/create")
    public ResponseEntity<ApplicationResponse> createNewPost(@RequestBody CreatePostRequestDto createPostRequest){
        //do stuff
        return response;
    }

Votre classe d'objet XML personnalisée: -

public class CreatePostRequestDto {
    String postPath;

    String postTitle;

    public String getPostPath() {
        return postPath;
    }

    public void setPostPath(String postPath) {
        this.postPath = postPath;
    }

    public String getPostTitle() {
        return postTitle;
    }

    public void setPostTitle(String postTitle) {
        this.postTitle = postTitle;
    }
}
0