273 votes

Spring MVC : objet complexe comme GET @RequestParam

Supposons que j'ai une page qui liste les objets dans un tableau et que j'ai besoin de mettre un formulaire pour filtrer le tableau. Le filtre est envoyé comme un Ajax GET à une URL comme celle-ci : http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z

Et au lieu d'avoir beaucoup de paramètres sur mon contrôleur comme :

@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    @RequestParam(value = "prop1", required = false) String prop1,
    @RequestParam(value = "prop2", required = false) String prop2,
    @RequestParam(value = "prop3", required = false) String prop3) { ... }

Et supposons que j'ai MyObject en tant que :

public class MyObject {
    private String prop1;
    private String prop2;
    private String prop3;

    //Getters and setters
    ...
}

Je veux faire quelque chose comme :

@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    @RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }

Est-ce possible ? Comment puis-je le faire ?

0voto

vkstream Points 508

Oui, vous pouvez le faire de manière simple. Voir le code des lignes ci-dessous.

URL - http://localhost:8080/get/request/multiple/param/by/map?name= 'abc' & id='123'

 @GetMapping(path = "/get/request/header/by/map")
    public ResponseEntity<String> getRequestParamInMap(@RequestParam Map<String,String> map){
        // Do your business here 
        return new ResponseEntity<String>(map.toString(),HttpStatus.OK);
    }

0voto

Gabriel Brito Points 92

La réponse acceptée fonctionne comme un charme mais si l'objet a une liste d'objets, cela ne fonctionnera pas comme prévu. Voici donc ma solution après quelques recherches.

Suivant ce fil conseil, voici comment j'ai procédé.

  • Frontend : stringifier votre objet puis l'encoder en base64 pour le soumettre.
  • Backend : décode la chaîne base64 puis convertit la chaîne json en objet souhaité.

Ce n'est pas la meilleure solution pour déboguer votre API avec postman mais cela fonctionne comme prévu pour moi.

Objet original : {page : 1, size : 5, filters : [{ field : "id", valeur : 1, comparaison : "EQ" }

Objet codé : eyJwYWdlIjoxLCJzaXplIjo1LCJmaWx0ZXJzIjpbeyJmaWVsZCI6ImlkUGFyZW50IwiY29tcGFyaXNvbiI6Ik5VTEwifV19

@GetMapping
fun list(@RequestParam search: String?): ResponseEntity<ListDTO> {
    val filter: SearchFilterDTO = decodeSearchFieldDTO(search)
    ...
}

private fun decodeSearchFieldDTO(search: String?): SearchFilterDTO {
    if (search.isNullOrEmpty()) return SearchFilterDTO()
    return Gson().fromJson(String(Base64.getDecoder().decode(search)), SearchFilterDTO::class.java)
}

Et voici les SearchFilterDTO et FilterDTO

class SearchFilterDTO(
    var currentPage: Int = 1,
    var pageSize: Int = 10,
    var sort: Sort? = null,
    var column: String? = null,
    var filters: List<FilterDTO> = ArrayList<FilterDTO>(),
    var paged: Boolean = true
)

class FilterDTO(
    var field: String,
    var value: Any,
    var comparison: Comparison
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X