#java #rss #xstream
#java #RSS-канал #xstream
Вопрос:
Я работаю над RSS-каналом, используя библиотеку XStream, и у меня есть следующая модель (упрощенная для примера)
public class Item {
private String title;
private String link;
private String guid; }
И он отлично работает, он генерирует ту часть XML, которая мне нужна. Проблема в том, что мне нужно добавить пользовательский атрибут для guid («isPermaLink»), и я не могу найти для этого никакого решения.
Итак, XML, который мне нужен, будет:
<item>
<title>Test</title>
<link>www.example.com/abc</link>
<guid isPermaLink="false">www.example.com/abc</guid>
</item>
Я знаю, что могу создать атрибут, используя
@XStreamAsAttribute
Итак, я попытался добавить другой класс для GUID
public class Guid {
private String value = "http://example.com/abc";
@XStreamAsAttribute
private boolean isPermaLink = true;
}
и укажите на это в моем классе Item, но тогда сгенерированный код содержит часть GUID, подобную этой:
<guid2 isPermaLink="true">
<value>http://example.com/abc</value>
</guid2>
И я не могу иметь этот элемент внутри. Значение должно быть встроенным.
Вопрос в том, как я могу сделать значение встроенным Или как я могу добавить атрибут в строковое поле
Ответ №1:
Извините за самостоятельный ответ, но, потратив некоторое время на эту тему, я наконец нашел ответ. Возможно, это может кому-то помочь, поэтому я публикую его здесь.
В принципе, я думаю, что нет способа сделать это по умолчанию. Я просмотрел все руководства по XStream, а также просмотрел каждую отдельную аннотацию, доступную из XStream.
Наконец-то мне удалось найти обходной путь, который работает. В принципе, для того, чтобы добавить атрибут в строку (например), вы можете использовать пользовательский конвертер и добавить туда атрибут. Итак, в моем поле guid я использую XStreamConverter для выбора моего конвертера:
@XStreamConverter(value = GuidConverter.class)
private String guid;
И сам конвертер:
public class GuidConverter implements Converter{
@Override
public boolean canConvert(Class type) {
return String.class.isAssignableFrom(type);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
String value = (String) source;
writer.addAttribute("isPermaLink", "false");
writer.setValue(value);
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
//TODO if you need - I don't because I'm only marshalling in my scenario
return null;
}
}
Жаль, что для этого нет решения «из коробки», потому что, если у вас было больше строки, для которой вы хотели присвоить атрибут, или вы хотели, чтобы значения этих атрибутов были динамическими… ну, решение для вас не сработает.
В моем случае это сработало, потому что мне всегда нужно одно и то же значение (isPermaLink=»false»), но в большинстве случаев этого будет недостаточно.
Возможно, у кого-то есть идея получше, как это сделать