我建议你看看JAX-RS Entity Providers。我将向您解释如何分别对响应和请求流进行编组和解组。
基本上你有MessageBodyReaders 和MessageBodyWriters(前者是从请求流中解组的那个。工作原理说你有这样的方法
@POST
@Consumes(MediaType.TEXT_PLAIN)
public Response postString(String s) {}
String s 与任何其他没有注释的方法参数一样被视为请求的主体。 (注意一个方法只能有一个非注释参数;即一个请求只能有一个主体)。因此,JAX-RS(实现的)运行时将查看提供者的注册表(确切地说是MessageBodyReaders),以寻找可以处理将text/plain 类型的主体解组为String 的提供者。一些标准类型有一些标准阅读器,这是免费提供的。
现在对于 JSON,假设我们有这个
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postJson(String json) {}
这也可以做到,因为有一个作家可以处理这个问题。基本上大部分时间都可以处理字符串参数。把 InputStream 做成 String 并不难,String 参数我们通常会免费获得支持。
但是如果我们想解组为不同的类型,比如Foo
class Foo {
String bar;
String baz;
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postJson(Foo foo) {}
我们有类似 JSON 的
{ "bar" : "barValue", "baz": "bazValue" }
我们可以这样做,但我们需要一个自定义阅读器。幸运的是,已经有一些了。我们只需要将库依赖项添加到 out 项目中。例如,Jackson(我会说 Java 中事实上的 JSON 处理器)为我们提供了一个阅读器。它在依赖项中
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.5.0</version>
</dependency>
我们可以将JacksonJsonProvider 注册到我们的应用程序中。然后我们将能够使用来自 JSON 的 POJO。 (有关注册的更多帮助,请提供有关您正在使用的 JAX-RS 实现的更多信息,并显示您的应用程序配置,无论是 web.xml 还是 Java 配置)
一些资源: