我的SpringWeb通量应用程序中有类所有的类,其中有getter/ setter,没有get和set前缀,setter返回这个类。因此,我还为成功序列化反序列化的所有控制器定义了定制的Jackson配置。
我的杰克逊·康菲
@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));
}
}
我的请求课
@Accessors(chain = true, fluent = true)
@Getter
@Setter // from project Lombok
public class Test {
private String a;
private List<String> b;
}
现在,如果我使用webclient提出请求,如下所示
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);
}
我得到了如下的例外
org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/json' not supported for bodyType=<Classpath>
但是,如果我像下面这样传递一个地图,它就能工作。
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?
发布于 2020-08-13 01:19:15
像下面这样创建Webclient解决了我的问题。
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();
https://stackoverflow.com/questions/62354488
复制相似问题