Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 马歇尔地图进入<;键>;价值</键>;失败_Java_Jaxb2 - Fatal编程技术网

Java 马歇尔地图进入<;键>;价值</键>;失败

Java 马歇尔地图进入<;键>;价值</键>;失败,java,jaxb2,Java,Jaxb2,我使用JDK7和Jaxb <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.7</version> </dependency> com.sun.xml.bind jaxb impl 2.2.7 我想制作一张地图,如下所示: <

我使用JDK7和Jaxb

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.7</version>
</dependency>

com.sun.xml.bind
jaxb impl
2.2.7
我想制作一张地图,如下所示:

<options>
  <key> VALUE </key>
  <key2> VALUE2 </key2>
 ...
</options>

价值
价值2
...
所以我试着这样做:

@XmlRootElement
public class Preferences {
    @XmlJavaTypeAdapter(OptionsMapAdapter.class)
    private Map<String, String> options;
}



public class OptionsMapAdapter extends XmlAdapter<OptionsMapAdapter.OptionsWrapper, Map<String, String>> {
    @Override
    public Map<String, String> unmarshal(final OptionsWrapper value) throws Exception {
        final Map<String, String> options = new HashMap<>();
        for (JAXBElement<String> option : value.options) {
            options.put(option.getName().toString(), option.getValue());
        }
        return options;
    }

    @Override
    public OptionsWrapper marshal(final Map<String, String> value) throws Exception {
        OptionsWrapper wrapper = new OptionsWrapper();
        for (Map.Entry<String, String> property : value.entrySet()) {
            wrapper.options.add(new JAXBElement<>(
                    new QName(property.getKey()),
                    String.class, property.getValue()));
        }
        return wrapper;
    }

    static class OptionsWrapper {
        @XmlAnyElement(lax = true)
        public List<JAXBElement<String>> options = new ArrayList<>();
    }
}
@XmlRootElement
公共阶级偏好{
@XmlJavaTypeAdapter(OptionsMapAdapter.class)
私人地图选项;
}
公共类选项MapAdapter扩展了XmlAdapter{
@凌驾
公共映射解组(最终选项包装值)引发异常{
最终映射选项=新建HashMap();
for(JAXBElement选项:value.options){
options.put(option.getName().toString(),option.getValue());
}
返回选项;
}
@凌驾
公共选项包装封送处理(最终映射值)引发异常{
OptionsWrapper=新的OptionsWrapper();
for(Map.Entry属性:value.entrySet()){
add(新的JAXBElement(
新的QName(property.getKey()),
String.class,property.getValue());
}
返回包装器;
}
静态类OptionsWrapper{
@xmlanyement(lax=true)
public List options=new ArrayList();
}
}
它在marshall上正常工作,但在解组时失败,出现错误:

java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl无法强制转换为 javax.xml.bind.JAXBElement

在调试时,我看到OptionsMapAdapter#unmarshal上的OptionsWrapper.options列表不包含JAXBElement的列表,而是com.sun.org.apache.xerces.internal.dom.ElementNSImpl的列表

这是一个bug吗?如何纠正这个问题(而不取消列表选项的类型)?
使用lax或不使用lax都会出现相同的问题。

此适配器的修改版本适用于编组和解编组(1.8.020)

公共类选项映射适配器
扩展XmlAdapter{
静态文档;
静止的{
尝试{文档=
DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
}捕获(例外e){
//错误处理
}
}
@凌驾
公共映射解组(最终选项包装值)引发异常{
最终映射选项=新建HashMap();
for(元素选项:value.options){
options.put(option.getTagName(),option.getTextContent());
}
返回选项;
}
@凌驾
公共选项包装封送处理(最终映射值)引发异常{
OptionsWrapper=新的OptionsWrapper();
for(Map.Entry属性:value.entrySet()){
Element=document.createElement(property.getKey());
元素setTextContent(property.getValue());
wrapper.options.add(元素);
}
返回包装器;
}
静态类OptionsWrapper{
@xmlanyement(lax=true)
public List options=new ArrayList();
}
}

org.w3c.dom.Element
比JAXBElement稍微不方便,但它只影响适配器。

编组字符串映射并解组生成的
optionwrapper
对我来说在
jdk 1.7.0_67
上与您的代码配合很好。@mystarrocks使用1.8.0_20,在首选项中返回的映射为空,并且永远不会调用OptionsMapAdapter.unmarshal。mystar,你有没有检查地图不是空的?
public class OptionsMapAdapter 
  extends XmlAdapter<OptionsMapAdapter.OptionsWrapper, Map<String, String>> {
  static Document document;
  static {
    try { document = 
        DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
      } catch( Exception e ){
        // error handling
      }
  }

  @Override
  public Map<String, String> unmarshal(final OptionsWrapper value) throws Exception {
    final Map<String, String> options = new HashMap<>();
    for (Element option : value.options) {
        options.put(option.getTagName(), option.getTextContent());
    }
    return options;
  }

  @Override
  public OptionsWrapper marshal(final Map<String, String> value) throws Exception {
    OptionsWrapper wrapper = new OptionsWrapper();
    for (Map.Entry<String, String> property : value.entrySet()) {
      Element element = document.createElement(property.getKey() );
      element.setTextContent( property.getValue() );
      wrapper.options.add( element );
    }
    return wrapper;
  }

  static class OptionsWrapper {
    @XmlAnyElement(lax = true)
    public List<Element> options = new ArrayList<>();
  }
}