Spring WebClient 放置映射:不支持内容类型“application/json”

Posted

技术标签:

【中文标题】Spring WebClient 放置映射:不支持内容类型“application/json”【英文标题】:Spring WebClient put Mapping: Content type 'application/json' not supported 【发布时间】:2019-02-20 19:08:08 【问题描述】:

我正在尝试使用 WebClient 通过 REST 调用另一个服务,但我总是收到错误:

org.springframework.web.reactive.function.UnsupportedMediaTypeException:不支持内容类型'application/json'

所有分配都具有相同版本的依赖关系,通过 Postman 调用资源可以正常工作。问题是当第一个应用程序作为代理(客户端)尝试调用第二个应用程序(服务)时

我的服务器资源:

@RequestMapping(value = "/properties")
@PutMapping(consumes = APPLICATION_JSON_UTF8_VALUE)
@ResponseStatus(CREATED)
public void saveProperty(@Valid @RequestBody PropertyForm form) 
    service.save(new PropertyImpl(form));

我的客户资源:

WebClient client = WebClient.create(serviceUrl);

Mono<Void> save(PropertyForm form) 
    return client.put()
            .uri("properties")
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .body(BodyInserters.fromObject(form))
            .retrieve()
            .bodyToMono(Void.class);

我的 build.gradle 文件:

dependencies 
    compile "org.springframework.boot:spring-boot-starter-reactor-netty:2.0.4.RELEASE"
    compile "org.springframework.boot:spring-boot-starter-web:2.0.4.RELEASE"
    compile "org.springframework:spring-webflux:5.0.4.RELEASE"

    compile "javax.xml.bind:jaxb-api:2.3.0"

我是否缺少一些依赖项来启用 JSON contentType?这个例子很简单,但对我来说也很成问题。

表单模型:

class PropertyForm 

    private String group;
    private String key;
    private String value;
    // getters & setters

来源:https://gitlab.com/Berilzar/Sandbox

【问题讨论】:

有趣,我已经重新创建了您的确切环境,它对我有用。能否也提供 PropertyForm 类? 这对我来说是最糟糕的情况。因为它应该从一开始就在理论上起作用。表单是简单的 Pojo,只有 getter。下班后我会尽快链接源代码。 你需要在你的类路径上有某种 Object -> Json 编码器,例如Jackson2JsonEncoder 进行从 Object 到 JSON 的编码 Json 序列化器存在,因为我有完美的 GET 映射。 【参考方案1】:

我终于找到了答案。问题实际上出在发送表单中。表单的范围是包,与 setter/getter 相同。在我将 PropertyForm 提取到 API 模块并公开所有内容后,它表示可以工作。

所以解决方案是将表单替换为:

public class PropertyForm 

    private String group;
    private String key;
    private String value;
    // public getters & setters

感谢您的帮助和时间。

【讨论】:

以上是关于Spring WebClient 放置映射:不支持内容类型“application/json”的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebClient 支持 Multiparts/related 吗?

如何在 Spring 响应式 WebClient 中返回 Kotlin Coroutines Flow

是否支持 Spring Boot WebClient OAuth2 client_credentials?

Spring WebClient 作为 RestTemplate 的替代品

Spring webclient exchangeToFlux()不发出HTTP请求

在不丢失 Spring Jackson 配置的情况下设置 WebClient.Builder.exchangeStrategies()