繁体   English   中英

用Feign客户端发布未知类的json

[英]Post json of unknown class with Feign client

我的服务必须将json数据重定向到另一个服务。 在虚假客户端上看到的所有示例中,sender都知道已发送对象的数据类型,因此看起来像这样:

@RequestMapping("some/path", consumes = [MediaType.APPLICATION_JSON_VALUE])
interface UploadClient {

    @PostMapping("upload")
    fun upload(book: Book): Long
}

我的问题是我没有Book类,只需要转发json。 我试图用String做到这一点,就像这样:

客户端界面:

@RequestMapping("some/path")
interface UploadClient {

    @PostMapping("/upload", consumes = arrayOf(MediaType.APPLICATION_JSON_VALUE))
    fun import(@RequestBody strangeData: String): Long

}

假装工厂:

class DefaultFeignClientFactory() : FeignClientFactory {

override fun <T> getClient(target: Class<T>, url: String): T {
    return registry.getOrPut(target) {
        Feign.builder()
            .target(target, url)
    } as T
}

}

使用OSGi实例化客户端:

  <bean id="uploadClient" factory-ref="feignClientFactory" factory-method="getClient">
    <argument value="com.blah.blahblah.UploadClient"/>
  </bean>

接收方的相同接口是:

 @RequestMapping("some/path")
 interface Loader {

     @PostMapping("/upload")
     fun import(@RequestBody myBooks: Collection<Book>): Long

 }

如果我将json直接扔到接收器中(curl / postman / etc),它将反序列化并正常工作。 将字符串传递给伪装客户端可以正常工作,但是不幸的是,接收者无法以这种方式反序列化它。 所以我试图将其更改为byte [](在Kotlin中为ByteArray):

    @PostMapping("/upload", consumes = arrayOf(MediaType.APPLICATION_JSON_VALUE))
    fun import(@RequestBody strangeData: ByteArray): Long

它属于org.springframework.web.HttpMediaTypeNotSupportedException message: Unsupported Media TypeMediaType.APPLICATION_OCTET_STREAM_VALUEMediaType.ALL_VALUE (实际上是ALL_VALUE掉了一些其他错误)一样,运气不好-数据没有以任何形式发送到接收器服务。

在这种情况下,我必须选择哪种Java数据类型和哪种MediaType? 提前致谢。

声明您的方法正在接受通用JSON的一种方法是使用Jackson的JsonNode作为参数类型。

@RequestMapping(value = ["some/path"], consumes = [MediaType.APPLICATION_JSON_VALUE])
interface UploadClient {

    @PostMapping("upload")
    fun upload(@RequestBody book: JsonNode): Long
}

这样,您就可以发布具有任意嵌套的JSON对象,JSON数组,字符串,数字或布尔值。 这是一个例子:

val book: ObjectNode = JsonNodeFactory.instance.objectNode()
        .put("authors", JsonNodeFactory.instance.arrayNode()
                .add("John Doe")
                .add("Jane Doe"))
        .put("title", "First Book about the Does")
        .put("year", 2018)

val id = uploadClient.upload(book)

这等效于以下请求

POST /some/path HTTP/1.1
Host: localhost:8080
Content-Type: application/json

{
  "authors": ["John Doe", "Jane Doe"],
  "title": "First Book about the Does",
  "year": 2018
}

使用JsonNode也可以在服务器端使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM