Я пытаюсь изменить значение тега в упорядоченном XML, используя JAXB, на . Мои клиенты, которые вызывают мое приложение, ожидают , ранее я использовал XSLT для этого преобразования, но я перехожу на подход JAXB для создания ответа XML.
Прямо сейчас это XML-код ошибки, который я создаю:
<error>
<details>
<entry>
<key>code</key>
<value>1234</value>
</entry>
<entry>
<key>customKey</key>
<value>customerValue</value>
</entry>
</details>
</error>
И мне нужно, чтобы это выглядело так:
<error>
<details>
<detail>
<key>code</key>
<value>1234</value>
</detail>
<detail>
<key>customKey</key>
<value>customerValue</value>
</detail>
</details>
</error>
Объект Java, который я использую для сортировки, выглядит следующим образом:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Map;
@XmlRootElement(
name = "error"
)
@XmlAccessorType(XmlAccessType.FIELD)
public class Error {
private Map<String, String> details;
public Error() {
}
public Error(Map<String, String> details) {
this.details = details;
}
public Map<String, String> getDetails() {
return details;
}
public void setDetails(Map<String, String> details) {
this.details = details;
}
}
Есть ли способ изменить соглашение об именах по умолчанию при маршаллинге карты в XML с использованием JAXB? Возможно ли, что я могу сделать это по-другому с вложенными объектами вместо хэш-карты?
Я бездельничал, пытаясь составить список <details>
, но у моего JAXB были проблемы с упорядочиванием списка.
Спасибо
Is there a way to change the default naming convention when marshalling a Map to XML using JAXB?
Я думаю, что нет никакого способа изменить это наименование, потому что имена элементов
<entry>
, <key>
и <value>
жестко запрограммированы в реализации JAXB.
В классе com.sun.xml.bind.v2.runtime.property.SingleMapNodeProperty
(который отвечает за сериализацию записи Map
) на самом деле есть этот код:
this.entryTag = context.nameBuilder.createElementName("","entry");
this.keyTag = context.nameBuilder.createElementName("","key");
this.valueTag = context.nameBuilder.createElementName("","value");
Is there possibly I can do this another way with nested objects instead of a hash map?
I was messing around attempting to do a List of
<details>
but my JAXB was having troubles marshalling a list.
Я не знаю, с какими проблемами вы столкнулись.
Но вы можете достичь своей цели, просто перейдя в свой Error
класс с
private Map<String, String> details;
к
@XmlElementWrapper(name = "details")
@XmlElement(name = "detail")
private List<Detail> details;
(и, конечно, также соответствующим образом адаптируя конструктор/геттер/сеттер).
Вам также понадобится класс Detail
для представления контента.
внутри <detail>...</detail>
.
@XmlAccessorType(XmlAccessType.FIELD)
public class Detail {
@XmlElement
private String key;
@XmlElement
private String value;
// constructors, getters, setters (omitted here for brevity)
}