2017-02-24 4 views
2

J'ai une application de démarrage à ressort dans laquelle j'essaie d'utiliser Feign pour communiquer avec un service distant. Mon @FeignClient est défini comme suit:FeignClient: Serialize RequestParam à JSON

@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 l'objet payload de type SomeServicePayload être en JSON sérialisé. Je m'attendais à ce que cela se produise automatiquement, mais ce n'est pas le cas. Au lieu de cela, payload est sérialisé à son nom de classe entièrement qualifié. Dois-je définir une combinaison codeur/décodeur personnalisée pour ce client? Comment ferais-je cela?

Répondre

0

@FeignClient sous le capot utilisé toString() méthode pour la chaîne de demande de bulding. La meilleure façon de créer la demande appropriée consiste à remplacer la méthode toString() manuellement:

class SomeServicePayload{ 
    String payload; 

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

ou pour des 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; 
    } 
}