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?
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.
@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;
}
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;
}
}