我的应用程序在 java 6 中运行良好,但是在我将 java 更新到版本 7 后,一些测试失败了。通过调试,我发现 jaxb 无法使用 java 7 正确解析某些 xml 文件。这是我的代码:
用于测试的 xml 文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ma:recommendations xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ma="http://schemas.hyi.com/service/1.0"><responseTime>17</responseTime><requestId>MRECS-123a40a9-9cbe-4580-88a2-d88e86abcac8</requestId>
<ma:recommendation>
<id>pop1-a</id>
<type></type>
<name></name>
<category></category>
<rating>1.0</rating>
<price></price>
<currency></currency>
<iconURI></iconURI>
<downloadURI></downloadURI>
<ratingCount></ratingCount>
<downloadCount></downloadCount>
<ma:extensions>
<ma:extension ma:key="type">
<ma:value>foo</ma:value>
</ma:extension>
</ma:extensions>
</ma:recommendation>
</ma:recommendations>
jaxb 无法再正确解析出扩展标签,它总是为扩展返回 null。
代码在这里:RecommendedItem .java
@XmlRootElement(namespace = XMLNamespace.URL)
@XmlAccessorType(XmlAccessType.NONE)
@XmlType()
public final class RecommendedItem implements Serializable {
/**
* Item type extension field name.
*/
public static final String ITEM_TYPE_EXTENSION = "type";
....
@XmlElement(name = "extensions", namespace = XMLNamespace.URL, required = false)
private ExtensionMap _extensions;
...
ExtensionMap.java
@XmlRootElement(namespace = XMLNamespace.URL)
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(namespace = XMLNamespace.URL)
public final class ExtensionMap extends HashMap<String, String> {
/** Serialized version unique identifier. */
private static final long serialVersionUID = -7235844731135521813L;
/**
* Default constructor to support JAXB binding.
*/
public ExtensionMap() {
super();
}
/**
* Default constructor to support JAXB binding.
* @param capacity The expected capacity of the map.
*/
public ExtensionMap(int capacity) {
super(capacity);
}
/**
* The list of wrapped Map entries that are structured for binding to XML
* with JAXB.
*
* @return The list of wrapped Map entries that are structured for binding
* to XML with JAXB.
*/
@XmlElement(name = "extension", namespace = XMLNamespace.URL, required = false)
@SuppressWarnings("unused")
private List<ExtensionMapElement> getEntries() {
return new ListAdapter();
}
/**
* The list of wrapped Map entries that are structured for binding to XML
* with JAXB.
*
* @param entries The list of wrapped Map entries that are structured for binding
* to XML with JAXB.
*/
@SuppressWarnings("unused")
private void setEntries(List<ExtensionMapElement> entries) {
if (entries != null) {
for (ExtensionMapElement entry : entries) {
put(entry.getKey(), entry.getValue());
}
}
}
/**
* Adapter for the list collection.
*
*/
private class ListAdapter implements List<ExtensionMapElement> {
@Override
public boolean add(ExtensionMapElement e) {
put(e.getKey(), e.getValue());
return true;
}
@Override
public void add(int index, ExtensionMapElement element) {
add(element);
}
@Override
public boolean addAll(Collection<? extends ExtensionMapElement> c) {
if (c != null) {
for (ExtensionMapElement element : c) {
add(element);
}
}
return true;
}
@Override
public boolean addAll(int index, Collection<? extends ExtensionMapElement> c) {
addAll(c);
return true;
}
@Override
public void clear() {
ExtensionMap.this.clear();
}
@Override
public boolean contains(Object o) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean containsAll(Collection<?> c) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public ExtensionMapElement get(int index) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int indexOf(Object o) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isEmpty() {
return ExtensionMap.this.isEmpty();
}
@Override
public Iterator<ExtensionMapElement> iterator() {
return new Iterator<ExtensionMapElement>() {
private Iterator<Map.Entry<String, String>> _iter = ExtensionMap.this.entrySet().iterator();
@Override
public boolean hasNext() {
return _iter.hasNext();
}
@Override
public ExtensionMapElement next() {
return new ExtensionMapElement(_iter.next());
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
};
}
@Override
public int lastIndexOf(Object o) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public ListIterator<ExtensionMapElement> listIterator() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public ListIterator<ExtensionMapElement> listIterator(int index) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean remove(Object o) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public ExtensionMapElement remove(int index) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean removeAll(Collection<?> c) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean retainAll(Collection<?> c) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public ExtensionMapElement set(int index, ExtensionMapElement element) {
add(element);
return null;
}
@Override
public int size() {
return ExtensionMap.this.size();
}
@Override
public List<ExtensionMapElement> subList(int fromIndex, int toIndex) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Object[] toArray() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public <T> T[] toArray(T[] a) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
/**
* A utility type that wraps map entries to support a mapping between a
* {@link java.util.Map} interface and a class that can be bound to XML using
* JAXB.
*/
@XmlRootElement(namespace = XMLNamespace.URL)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = XMLNamespace.URL)
final class ExtensionMapElement implements Serializable {
/**
* Serialized version unique identifier.
*/
private static final long serialVersionUID = 8211130122512683829L;
/**
* The key of the wrapped map entry.
*/
@XmlAttribute(name = "key", namespace = XMLNamespace.URL, required = true)
private String _key;
/**
* The value of the wrapped map entry.
*/
@XmlElement(name = "value", namespace = XMLNamespace.URL, required = true)
private String _value;
/**
* Default constructor to support JAXB Binding.
*/
public ExtensionMapElement() {
}
/**
* Wraps a map entry with an instance of this class.
*
* @param e
* The map entry to wrap.
*/
public ExtensionMapElement(Map.Entry<String, String> e) {
_key = e.getKey();
_value = e.getValue();
}
/**
* The key of the wrapped map entry.
*
* @return The key of the wrapped map entry.
*/
public String getKey() {
return _key;
}
/**
* The value of the wrapped map entry.
*
* @return The value of the wrapped map entry.
*/
public String getValue() {
return _value;
}
}
请帮忙。谢谢。