Spring WebClient传递Domain对象POST请求失败,传JSON字符串正常
问题排查与解决方案
你的问题核心是Jackson序列化的字段命名不匹配,以及领域类缺少必要的访问方法,导致自定义对象无法被正确序列化为接口预期的JSON格式。
问题根源
你手动构造的JSON中字段名是首字母大写的Login、Password、Domain,但默认情况下Jackson序列化Java对象时,会将类字段转为小驼峰格式(比如login),导致接口接收的字段名与预期不符;同时你的Login类只有私有字段,没有提供getter/setter方法,Jackson无法读取和序列化字段值。
解决方案
方案1:使用@JsonProperty指定序列化字段名(推荐)
通过注解精准控制每个字段序列化后的JSON名称,同时补充getter/setter方法:
import com.fasterxml.jackson.annotation.JsonProperty; public class Login { @JsonProperty("Login") private String Login; @JsonProperty("Password") private String Password; @JsonProperty("Domain") private String Domain; // 必须添加getter和setter方法,供Jackson访问字段 public String getLogin() { return Login; } public void setLogin(String login) { Login = login; } public String getPassword() { return Password; } public void setPassword(String password) { Password = password; } public String getDomain() { return Domain; } public void setDomain(String domain) { Domain = domain; } }
方案2:全局配置Jackson命名策略(不推荐,影响全局接口)
如果所有接口都要求首字母大写的字段名,可以在WebClient配置中修改Jackson的命名策略:
import com.fasterxml.jackson.databind.PropertyNamingStrategy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { @Bean public WebClient webClient() { ExchangeStrategies strategies = ExchangeStrategies.builder() .codecs(configurer -> { configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder( Jackson2JsonEncoder.defaultObjectMapper() .setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE))); configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder( Jackson2JsonDecoder.defaultObjectMapper() .setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE))); }) .build(); return WebClient.builder() .exchangeStrategies(strategies) .build(); } }
优化WebClient调用代码
使用更简洁的bodyValue方法替代body(Mono.just(...)):
String resp = webClient .post() .uri("https://sssss.com") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) .bodyValue(login) .retrieve() .bodyToMono(String.class) .block();
内容的提问来源于stack exchange,提问作者TXTech
相关产品推荐
相关产品推荐

