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



我的服务必须将json数据重定向到另一个服务。在我在foreign客户端上看到的所有示例中,发送方都知道发送对象的数据类型,所以它看起来是这样的:

@RequestMapping("some/path", consumes = [MediaType.APPLICATION_JSON_VALUE])
interface UploadClient {
@PostMapping("upload")
fun upload(book: Book): Long
}

我的问题是我没有Book类,我只需要转发json。我试着用字符串来做这件事,比如:

客户端接口:

@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/poster/etc(,它会对其进行反序列化并正常工作。将字符串传递给外部客户端是可行的,但遗憾的是,接收器无法以这种方式对其进行反序列化。所以我尝试将其更改为byte[](Kotlin中的ByteArray(:

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

并且与CCD_ 1一起下降与MediaType.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。

相关内容

  • 没有找到相关文章

最新更新