2 votes

FeignClient : Sérialisation de RequestParam en JSON

J'ai une application spring boot dans laquelle j'essaie d'utiliser Feign pour communiquer avec un service distant. Mon @FeignClient est défini comme suit :

@FeignClient(name="TEST_SERVICE", url="URL")
@Component
public interface SomeServiceClient
{
    @RequestMapping(
        method = RequestMethod.POST,
        value = "/someService",
        consumes = "application/json",
        produces = "application/json"
    )
    SomeServiceResult getServiceResult(
        @RequestParam(value = "mode") String mode,
        @RequestParam(value = "payload") SomeServicePayload payload
    );
}

Je voudrais que le payload objet de type SomeServicePayload pour être sérialisé en JSON. Je m'attendais à ce que cela se fasse automatiquement, mais ce n'est pas le cas. Au lieu de cela, payload est sérialisée en son nom de classe pleinement qualifié.

Dois-je définir une combinaison d'encodeur/décodeur personnalisée pour ce client ? Comment dois-je procéder ?

0voto

Andriy Br. Points 81

@FeignClient sous le capot utilisé toString() pour compléter la chaîne de demande. La façon la plus simple de créer une requête correcte est de surcharger la méthode toString() manuellement :

class SomeServicePayload{
    String payload;

    @Override
    public String toString() {
        return "{\"payload\":\"" + payload + "\"}";
    }
}

Ou pour les objets complexes en utilisant ObjectMapper :

public class SomeServicePayload{

    private String payload;

    public String getPayload() {
        return payload;
    }

    public void setPayload(String payload) {
        this.payload = payload;
    }

    private ObjectMapper mapper = new ObjectMapper();
    @Override
    public String toString() {
        try {
            return mapper.writeValueAsString(this);
        } catch (JsonProcessingException e) {
            //...
        }
        return null;
    }
}

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