是否可以在注释中使用NamedMapConverter?怎么样?

时间:2015-01-13 16:01:12

标签: java xstream

我想使用NamedMapConverter的某个变体(来自XStream库)。

  new NamedMapConverter(xstream.getMapper(), "mapping", "value", String.class, "color", HexColor.class, true, true, xstream.getConverterLookup());

但我想用它作为注释。我猜是在下面。 HexColor的SingleValueConverter已经实现。

  @XStreamConverter(value = NamedMapConverter.class, strings = { "mapping", "value", "color" }, booleans = { true, true }, types = { String.class, HexColor.class })
  private Map<String, HexColor> colorMappings;

但是,令人惊讶的是,它没有用。我究竟做错了什么?下面的示例结果。

  <colorMappings>
        <mapping>
              <value>Something</value>
              <color>007cc2</color>
         </mapping>
  </colorMappings>

我找到了这种奇怪行为的原因。它是由XStream库中的错误引起的。在AnnotationMapper类中,有一个cacheConverter方法。

private Converter cacheConverter(final XStreamConverter annotation,
    final Class targetType) {
    Converter result = null;
    final Object[] args;
    final List<Object> parameter = new ArrayList<Object>();
    if (targetType != null && annotation.useImplicitType()) {
        parameter.add(targetType);
    }
    final List<Object> arrays = new ArrayList<Object>();
    arrays.add(annotation.booleans());
    arrays.add(annotation.bytes());
    arrays.add(annotation.chars());
    arrays.add(annotation.doubles());
    arrays.add(annotation.floats());
    arrays.add(annotation.ints());
    arrays.add(annotation.longs());
    arrays.add(annotation.shorts());
    arrays.add(annotation.strings());
    arrays.add(annotation.types());
    for(Object array : arrays) {
        if (array != null) {
            int length = Array.getLength(array);
            for (int i = 0; i < length; i++ ) {
                Object object = Array.get(array, i);
                if (!parameter.contains(object)) {
                    parameter.add(object);
                }
            }
        }
    }

关键片段在下面重复。

                if (!parameter.contains(object)) {
                    parameter.add(object);
                }

因此,如果任何数组中存在两个相似的值(在这种情况下 - 布尔值为true且为true,但其他重复值也会出现问题),其中只有一个会添加到参数中。因此,参数列表将是错误的(缺少一个布尔值)并且与正确的构造函数不匹配。

但是,目前我还不知道如何围绕这个问题进行编码。

1 个答案:

答案 0 :(得分:1)

一个简单(但很难看)的修复是创建扩展NamedMapConverter

的新转换器
public class BetterNamedMapConverter extends NamedMapConverter {

    public BetterNamedMapConverter(Mapper mapper, String entryName, String keyName, Class keyType, String valueName, Class valueType,
            boolean asAttributes, ConverterLookup lookup) {
        super(mapper, entryName, keyName, keyType, valueName, valueType, asAttributes, asAttributes, lookup);
    }

}

并将注释更改为

@XStreamConverter(value = BetterNamedMapConverter.class, strings = { "mapping", "value", "color" }, booleans = { true }, types = { String.class, HexColor.class }, useImplicitType = false)

尽管如此,这个错误让我感到困惑(并且有些情况下解决这个问题会更糟糕)。