【问题标题】:In Jersey, how do I make some methods use the POJO mapping feature and some not?在泽西岛,我如何让一些方法使用 POJO 映射功能而另一些不使用?
【发布时间】:2013-09-06 14:37:32
【问题描述】:

我有一个资源(这不是必需的),其中包含许多不同的@GET 方法。我已将 web.xml 配置为包含以下内容:

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

这会打开POJO mapping feature,效果很好。它允许我返回一个 pojo,它会自动转换为 JSON。

问题是我有一些我想重用的代码将 JSON 作为字符串返回。我在使用这些方法时遇到了麻烦,因为 Jersey 不会将其解释为 JSON 响应,而是将其解释为 JSON 对象的字符串值。因此,例如,如果返回 String 的方法返回客户端看到的空列表

"[]"

而不是

[]

问题是 JSON 用双引号括起来。对于这些返回字符串的方法,我如何告诉 Jersey 按原样返回字符串?

【问题讨论】:

    标签: java rest jersey


    【解决方案1】:

    您可能必须使用自定义响应(或请求)映射器。

    1.- 创建一个实现 MessageBodyWriter(或 MessageBodyReader)的类,负责写入/读取响应

    @Provider
    public class MyResponseTypeMapper 
      implements MessageBodyWriter<MyResponseObjectType> {
         @Override
         public boolean isWriteable(final Class<?> type,final Type genericType,
                    final Annotation[] annotations,
                    final MediaType mediaType) {
           ... use one of the arguments (either the type, an annotation or the MediaType)
               to guess if the object shoud be written with this class
         }
         @Override
         public long getSize(final MyResponseObjectType myObjectTypeInstance,
                         final Class<?> type,final Type genericType,
                             final Annotation[] annotations,
                         final MediaType mediaType) {
            // return the exact response length if you know it... -1 otherwise
            return -1;
        }
        @Override
        public void writeTo(final MyResponseObjectType myObjectTypeInstance,
                        final Class<?> type,final Type genericType,
                        final Annotation[] annotations, 
                        final MediaType mediaType,
                        final MultivaluedMap<String,Object> httpHeaders,
                        final OutputStream entityStream) throws IOException,                                                                 WebApplicationException {
            ... serialize / marshall the MyResponseObjectType instance using
                whatever you like (jaxb, etC)
            entityStream.write(serializedObj.getBytes());
        }
    }
    

    2.- 在您的应用中注册映射器

    public class MyRESTApp 
         extends Application  {
        @Override
    public Set<Class<?>> getClasses() {
            Set<Class<?>> s = new HashSet<Class<?>>();
            s.add(MyResponseTypeMapper.class);
            return s;
        }
    }
    

    Jersey 将扫描所有已注册的调用其 isWriteable() 方法的 Mapper,直到其中一个返回 true...如果是,则此 MessageBodyWriter 实例将用于将内容序列化到客户端

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 2017-09-18
      • 2017-06-13
      相关资源
      最近更新 更多