Restlet GAE 的@XStreamOmitField 不工作

@XStreamOmitField for Restlet GAE not working

我有一个用 @XStreamOmitField 注释的 POJO 字段,但是当我查看 ServerResource 的响应时,该字段就在那里。

这是我的代码(已简化):

@Override
public ItemDTO getStuff() {
   return stuff.getItem();
}

这是我的 POM 配置:

      <dependency>
          <groupId>org.restlet.gae</groupId>
          <artifactId>org.restlet</artifactId>
          <version>${version.restlet}</version>
      </dependency>
      <dependency>
          <groupId>org.restlet.gae</groupId>
          <artifactId>org.restlet.ext.servlet</artifactId>
          <version>${version.restlet}</version>
      </dependency>
      <dependency>
          <groupId>org.restlet.gae</groupId>
          <artifactId>org.restlet.ext.xstream</artifactId>
          <version>${version.restlet}</version>
      </dependency>
      <dependency>
          <groupId>org.restlet.gae</groupId>
          <artifactId>org.restlet.ext.json</artifactId>
          <version>${version.restlet}</version>
      </dependency>

版本是,<version.restlet>2.3.1</version.restlet>

这里可能有什么问题?应该是自动的吧?

更新:

我的想法是,这是由我的应用程序中使用的 APISpark 库引起的,导致 XStream 未被使用以支持 Jackson:

  <dependency>
      <groupId>org.restlet.gae</groupId>
      <artifactId>org.restlet.ext.apispark</artifactId>
      <version>${version.restlet}</version>
      <exclusions>
          <exclusion>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.1</version>
  </dependency>

由于扩展 org.restlet.ext.apispark 使用扩展 org.restlet.ext.jackson,后者除了扩展 org.restlet.ext.xstreamorg.restlet.ext.json 之外自动注册一个转换器。

您可以通过以下方法查看注册了哪些转换器:

private void configureConverters() {
    List<ConverterHelper> converters = Engine.getInstance()
            .getRegisteredConverters();
    for (ConverterHelper converterHelper : converters) {
        System.out.println(converterHelper.getClass());
    }
}

@Override
public Restlet createInboundRoot() {
    configureConverters();
    (...)
}

注册取决于类路径中的顺序,所以我猜 jackson 是第一个注册的。这意味着这是用来转换您请求的响应数据的。

为了能够使用 Jettison 扩展,您需要手动删除已注册的 Jackson 转换器,如下所述:

private void configureConverters() {
    List<ConverterHelper> converters = Engine.getInstance()
            .getRegisteredConverters();
    JacksonConverter jacksonConverter = null;
    for (ConverterHelper converterHelper : converters) {
        System.err.println(converterHelper.getClass());
        if (converterHelper instanceof JacksonConverter) {
            jacksonConverter = (JacksonConverter) converterHelper;
            break;
        }
    }

    if (jacksonConverter != null) {
        Engine.getInstance()
                .getRegisteredConverters().remove(jacksonConverter);
    }
}

希望对你有帮助, 蒂埃里