Не удается применить @XStreamConverter ToAttributedValueConverter - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу, чтобы некоторые классы дерева XML были демаршированы как текстовые узлы, но я не смог заставить это работать в моем случае использования: абстрактной иерархии классов.

Я попытался зарегистрировать конвертер программно, чтобы объявитьэто по конкретным классам (API док даже говорит, что унаследованные поля обрабатываются).

@Bean
public Marshaller marshaller() {
    XStreamMarshaller marshaller = new XStreamMarshaller();
    marshaller.setAutodetectAnnotations(true);
    return marshaller;
}
@XStreamConverter(value = ToAttributedValueConverter.class, strings = "value")
public abstract class AbstractProp {
    @XStreamAsAttribute
    private final String name;
    private final String value;
}
@XStreamAlias("boolProp")
public class BoolProp extends AbstractProp {
    public BoolProp(String name, Boolean value) {
        super(name, value.toString());
    }
}

ОЖИДАЕТСЯfalse

ACTUAL ложь

1 Ответ

0 голосов
/ 25 апреля 2019

Хорошо.Я нашел в исходном коде, что не так с наследованием:

public class ToAttributedValueConverter implements Converter {
...
@Override
public boolean canConvert(final Class<?> type) {
    return this.type == type;
}

Так что я сделал это в качестве обходного пути:

public class TextNodeConverter extends ToAttributedValueConverter {

private final Class<?> type;

public TextNodeConverter(Class type, Mapper mapper, ReflectionProvider reflectionProvider, ConverterLookup lookup) {
    this(type, mapper, reflectionProvider, lookup, null, null);
}

public TextNodeConverter(Class type, Mapper mapper, ReflectionProvider reflectionProvider, ConverterLookup lookup,
        String valueFieldName) {
    this(type, mapper, reflectionProvider, lookup, valueFieldName, null);
}

public TextNodeConverter(Class type, Mapper mapper, ReflectionProvider reflectionProvider, ConverterLookup lookup,
        String valueFieldName, Class valueDefinedIn) {
    super(type, mapper, reflectionProvider, lookup, valueFieldName, valueDefinedIn);
    this.type = type;
}

@Override
public boolean canConvert(final Class type) {
    return this.type.isAssignableFrom(type);
}
}

И, ну ... после переключения преобразователя, который работалкак шарм: -)

...