Как изменить имя тега Hashmap по умолчанию с <entry> на другое при маршаллинге XML с использованием JAXB?

Я пытаюсь изменить значение тега в упорядоченном 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 были проблемы с упорядочиванием списка.

Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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)
}

Другие вопросы по теме