使用 JAXB 编组 XML 时,如何将默认的 Hashmap 标记名称从 <entry> 更改为其他名称?
How to change default Hashmap tag name from <entry> to something else when marshalling XML using JAXB?
我正在尝试使用 JAXB 将编组 XML 中的标记值更改为 .调用我的应用程序的客户期望,以前我使用 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;
}
}
在使用 JAXB 将 Map 编组为 XML 时,有没有办法更改默认命名约定?有没有可能我可以用嵌套对象而不是散列映射来做这件事?
我正试图做一个 <details>
的列表,但我的 JAXB 在编组列表时遇到了麻烦。
谢谢
Is there a way to change the default naming convention
when marshalling a Map to XML using JAXB?
我认为没有办法改变这个命名,因为元素名称
<entry>
、<key>
和 <value>
在 JAXB 实现中是 hard-coded。
在 class 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
从
更改为 class 即可实现您的目标
private Map<String, String> details;
到
@XmlElementWrapper(name = "details")
@XmlElement(name = "detail")
private List<Detail> details;
(当然也相应地调整 constructor/getter/setter)。
您还需要 Detail
class 来表示内容
<detail>...</detail>
.
以内
@XmlAccessorType(XmlAccessType.FIELD)
public class Detail {
@XmlElement
private String key;
@XmlElement
private String value;
// constructors, getters, setters (omitted here for brevity)
}
我正在尝试使用 JAXB 将编组 XML 中的标记值更改为 .调用我的应用程序的客户期望,以前我使用 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;
}
}
在使用 JAXB 将 Map 编组为 XML 时,有没有办法更改默认命名约定?有没有可能我可以用嵌套对象而不是散列映射来做这件事?
我正试图做一个 <details>
的列表,但我的 JAXB 在编组列表时遇到了麻烦。
谢谢
Is there a way to change the default naming convention when marshalling a Map to XML using JAXB?
我认为没有办法改变这个命名,因为元素名称
<entry>
、<key>
和 <value>
在 JAXB 实现中是 hard-coded。
在 class 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;
(当然也相应地调整 constructor/getter/setter)。
您还需要 Detail
class 来表示内容
<detail>...</detail>
.
@XmlAccessorType(XmlAccessType.FIELD)
public class Detail {
@XmlElement
private String key;
@XmlElement
private String value;
// constructors, getters, setters (omitted here for brevity)
}