Неявная карта Xstream как атрибуты корневого элемента - PullRequest
1 голос
/ 30 сентября 2011

Я пытаюсь найти решение для преобразования карты в атрибуты корневого элемента с помощью XStream.

Я не думаю, что это возможно, но вот что я пытался далеко.

Я создал собственный конвертер и прикрепил его к корневому объекту, затем в конвертере я получаю доступ к карте, которую пытаюсь преобразовать в атрибуты, перебираю карту и записываю attirbute в узел, используя программу записи .addAttribute (entry.getKey (), entry.getValue ()); это действительно записывает атрибуты в корневой узел, например

Проблема с этим подходом заключается в том, что он не обрабатывает остальную часть документа, он просто останавливается после обработки карты, чтобы заставить это работать, мне нужен какой-то метод, позволяющий вернуть конвертер по умолчанию в управление и завершить работу. модель.

Второе решение, которое я пытался использовать, - это создание собственного конвертера только для самой карты, проблема с этим подходом заключается в том, что я не могу получить дескриптор корневого элемента, поэтому я не могу писать в него, можно ли получить доступ к корневому элементу таким образом?

Спасибо, Jon

1 Ответ

1 голос
/ 30 сентября 2011

Создайте конвертер, который записывает карту и использует маршалинг объекта, используя конвертер отражения:

static class MyConverter implements Converter {

    private final Map<String, String> attributes;

    private final Class<?> clazz;

    private final Mapper mapper;

    private final ReflectionProvider reflectionProvider;

    public MyConverter(Mapper mapper,
            ReflectionProvider reflectionProvider, Class<?> clazz,
            Map<String, String> attributes) {
        super();
        this.mapper = mapper;
        this.reflectionProvider = reflectionProvider;
        this.attributes = attributes;
        this.clazz = clazz;
    }

    @Override
    public boolean canConvert(Class cls) {
        return cls == clazz;
    }

    @Override
    public void marshal(Object value, HierarchicalStreamWriter writer,
            MarshallingContext context) {
        for (String key : attributes.keySet()) {
            writer.addAttribute(key, attributes.get(key));
        }

        Converter converter = new ReflectionConverter(mapper,
                reflectionProvider);
        context.convertAnother(p, converter);
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader arg0,
            UnmarshallingContext arg1) {
        // TODO Auto-generated method stub
        return null;
    }

}

Извлеките экземпляры Mapper и ReflectionProvider из вашего экземпляра XStream и зарегистрируйте конвертер со всеми необходимыминастройка:

    XStream xs = new XStream(new DomDriver());
    Mapper mapper = xs.getMapper();
    ReflectionProvider reflectionProvider = xs.getReflectionProvider();
    xs.alias("youralias", YourRoot.class);
    xs.registerConverter(new MyConverter(mapper, reflectionProvider,
            YourRoot.class, map));

    System.out.println(xs.toXML(yourRoot));
...