1

我有一个现有的 Jersey/JAX-RS 注释资源,该资源具有一个方法,@Consumes("application/json")该方法采用 POJO 的 JSON 序列化并将其反序列化为 POJO。由于某些遗留原因,我还需要允许它在 Content-Type 为“text/plain”时使用数据,其中 HTTP 正文内容仍将是 JSON。

有谁知道我怎么能做到这一点?现在,如果我修改@Consumes 注释以添加“text/plain”Jersey 会抛出一个异常,说它没有适合“text/plain”MIME 和我的 Java 类型的消息正文阅读器:

A message body reader for Java class REDACTED, and Java type class REDACTED, and MIME media type text/plain was not found.

谢谢!

4

2 回答 2

2

我最终只是使用 ContainerRequestFilter 重写了 Content-Type ......我不喜欢这个解决方案,但它有效。如果对 Java 人来说,Source 看起来有点时髦,那就是 Groovy。

final class TextPlainToApplicationJsonContentTypeRewriteFilter implements ContainerRequestFilter {

    @Override
    ContainerRequest filter(ContainerRequest request) {
        if(request.getHeaderValue(HttpHeaders.CONTENT_TYPE).trim().startsWith(MediaType.TEXT_PLAIN)) {
            request.requestHeaders.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
        }

        request
    }
}
于 2013-10-02T14:01:27.377 回答
2

这可能是一种更有效的处理方式。

@Provider
@Consumes({ MediaType.TEXT_PLAIN })
public class FTMessageBodyReader extends JacksonJsonProvider {

    @Override
    protected boolean hasMatchingMediaType(MediaType mediaType) {
        return true;
    }

}

final Client client = ClientBuilder.newClient();
client.register(new LoggingFilter(Logger.getLogger("FTCLientFactory"), true));
client.register(FTMessageBodyReader.class);
于 2016-03-25T14:18:03.553 回答