首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当将类与自定义getter setter一起使用为WebClient时,MediaType不支持异常

当将类与自定义getter setter一起使用为WebClient时,MediaType不支持异常
EN

Stack Overflow用户
提问于 2020-06-13 01:22:37
回答 1查看 689关注 0票数 0

我的SpringWeb通量应用程序中有类所有的类,其中有getter/ setter,没有get和set前缀,setter返回这个类。因此,我还为成功序列化反序列化的所有控制器定义了定制的Jackson配置。

我的杰克逊·康菲

代码语言:javascript
代码运行次数:0
运行
复制
@Configuration
public class JacksonObjectMapperConfiguration implements Jackson2ObjectMapperBuilderCustomizer {

  @Override
  public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
    jacksonObjectMapperBuilder
      .serializationInclusion(NON_NULL)
      .failOnUnknownProperties(false)
      .visibility(FIELD, ANY)
      .modulesToInstall(new ParameterNamesModule(PROPERTIES));
  }
}

我的请求课

代码语言:javascript
代码运行次数:0
运行
复制
@Accessors(chain = true, fluent = true)
@Getter
@Setter // from project Lombok
public class Test {
  private String a;
  private List<String> b;
}

现在,如果我使用webclient提出请求,如下所示

代码语言:javascript
代码运行次数:0
运行
复制
  public Mono<Void> postRequest(String a, List<String> b) {
    Webclient webclient = Webclient.create();
    return webClient.post()
      .uri("some_url")
      .contentType(MediaType.APPLICATION_JSON)
      .bodyValue(new Test().a(a).b(b))
      .retrieve()
      .bodyToMono(Void.class);
  }

我得到了如下的例外

代码语言:javascript
代码运行次数:0
运行
复制
org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/json' not supported for bodyType=<Classpath>

但是,如果我像下面这样传递一个地图,它就能工作。

代码语言:javascript
代码运行次数:0
运行
复制
  public Mono<Void> postRequest(String a, List<String> b) {
    Webclient webclient = Webclient.create();
    return webClient.post()
      .uri(format("some_url")
      .contentType(MediaType.APPLICATION_JSON)
      .bodyValue(new HashMap<String,Object>(){{put("a",a);put("b",b);}})
      .retrieve()
      .bodyToMono(Void.class);
  }

我已经尝试过删除@Accessor注释并自己创建getter setter,但是它仍然不起作用。

我认为例外的发生是由于一些反序列化问题。不过,我不太确定。杰克逊在应用程序中和我所有的控制器一起工作很好。

如何使第一个案例工作,在这里我可以提供一个类作为主体而不是Map?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-13 09:19:15

像下面这样创建Webclient解决了我的问题。

代码语言:javascript
代码运行次数:0
运行
复制
  public WebClient webClient() {
    WebClient.Builder builder = WebClient.builder();
    builder.exchangeStrategies(EXCHANGE_STRATEGIES)
      .defaultHeader("content-type", "application/json");
    return builder.build();
  }

  public static final ObjectMapper GSON_LIKE_OM = new ObjectMapper()
    .setSerializationInclusion(NON_NULL)
    .setVisibility(FIELD, ANY)
    .configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
    .registerModule(new ParameterNamesModule(PROPERTIES));

  public static final ExchangeStrategies EXCHANGE_STRATEGIES = ExchangeStrategies
    .builder()
    .codecs(clientDefaultCodecsConfigurer -> {
      clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(GSON_LIKE_OM, APPLICATION_JSON));
      clientDefaultCodecsConfigurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(GSON_LIKE_OM, APPLICATION_JSON));
    }).build();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62354488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档