FeignClient:将RequestParam序列化为JSON

Bri*_*ker 5 jackson spring-boot feign

我有一个 Spring Boot 应用程序,我试图用它Feign来与远程服务进行通信。我@FeignClient的定义如下:

@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
    );
}
Run Code Online (Sandbox Code Playgroud)

我希望将payloadtype 的对象SomeServicePayload序列化为 JSON。我预计这会自动发生,但事实并非如此。相反,payload被序列化为其完全限定的类名。

我需要为此客户端设置自定义编码器/解码器组合吗?我该怎么做?

小智 1

@FeignClient在幕后使用了toString()构建请求字符串的方法。创建正确请求的最简单方法是手动覆盖toString()方法:

class SomeServicePayload{
    String payload;

    @Override
    public String toString() {
        return "{\"payload\":\"" + payload + "\"}";
    }
}
Run Code Online (Sandbox Code Playgroud)

或者使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 真的吗?Feign 是否依赖于`toString()`而不是Spring的`ObjectMapper`?我看不到任何好处。如何将此行为切换为使用 ObjectMapper?例如,使用对象映射器允许序列化,包括元数据属性,例如类型信息,这使得序列化对象能够实现多态性。我需要为 Feign 实现这种行为。 (4认同)