Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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 JAXB和List的另一个编组异常<;某物>;_Java_Xml_Jaxb_Marshalling - Fatal编程技术网

Java JAXB和List的另一个编组异常<;某物>;

Java JAXB和List的另一个编组异常<;某物>;,java,xml,jaxb,marshalling,Java,Xml,Jaxb,Marshalling,下面是我的请求类,它包含一个泛型请求: import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.bind.annotation.

下面是我的请求类,它包含一个泛型请求:

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author lorddoskias
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Request {

    private List<StringStringMapEntry> parameters = new ArrayList<StringStringMapEntry>();
    private List<StringStringMapEntry> headers = new ArrayList<StringStringMapEntry>();
    @XmlAnyElement(lax=true)
    private Object requestBody = null;  // this has to reference a JAXB-enabled object
    private String resourcePath;


    public Request() {
    }

    public Object getRequestBody() {
        return requestBody;
    }

    public void setRequestBody(Object requestBody) {
        this.requestBody = requestBody;
    }
我会这样做:

List<Sequence> seq = new ArrayList<Sequence>();
        seq.add(seq1);
        seq.add(seq2);

        client.insertIndividualStatistics(PostRequest.assemblyIndividualStats(66, seq));
我认为JAXB支持简单列表,如果它们不是根对象?我甚至尝试了一些不同的方法——将列表包装在一个简单的JAXB注释类中:

import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author lorddoskias
 */
@XmlRootElement
public class MySequenceListWrapper {

    @XmlElement(name = "List")
    private List<Sequence> list;

    public MySequenceListWrapper() {/*JAXB requires it */

    }

    public MySequenceListWrapper(List<Sequence> list) {
        this.list = list;
    }

    public List<Sequence> getList() {
        return list;
    }
}
import java.util.List;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
/**
*
*@作者洛多斯基亚斯
*/
@XmlRootElement
公共类MySequenceListWrapper{
@xmlement(name=“List”)
私人名单;
public MySequenceListWrapper(){/*JAXB需要它*/
}
公共MySequenceListWrapper(列表){
this.list=列表;
}
公共列表getList(){
退货清单;
}
}

将其设置为requestBody,但我得到了一个类似的异常,但不是说ArrayList未被识别,而是说MySequenceListWrapper未被识别。我已经阅读了Blaise Doughan博客上的文章,我怀疑至少在后一种情况下它应该可以工作,因为我有适当的XmlAnyElement注释?

您可以使用JAX-RS
ContextResolver
来制作一个
JAXBContext
知道
MySequenceListWrapper
类。或者您也可以利用
@xmlsee
注释,如下所示:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({MySequenceListWrapper.class})
public class Request {
    ...
}

是否使用XmlAnyElement时,XmlSee也是必需的?还可以为我怀疑可能在请求类中显示的有限组对象提供一个XMLSEEAL列表吗?
@XMLSEEAL
在使用
@XmlAnyElement
时不是强制性的。它只是一种确保在创建
JAXBContext
时包含类的机制。您使用的是Jersey客户端API,因为您尚未注册
ContextResolver
,因此将在返回类型上创建一个JAXBContext,并在遍历类模型时拉入类。在此遍历中未访问的类不会成为映射类。
@xmlsee也
放在映射类上时,也会导致被引用的类被映射
@xmlsee也
接受一个类数组,这样您就可以引用很多类。有没有办法避免使用包装器对象?正如我在问题中所说的,我记得在某个地方读到过JAXB可以管理编组/解编组列表,而无需特别干预?这样我就可以直接了解您的用例,
MySequenceWrapper
的一个实例在
Request.requestBody
上设置,您会问是否可以设置
列表
?确切地说,我使用包装器的唯一原因是为了方便编组/解编,而无需编写自定义的锅炉板代码
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
 - with linked exception:
[javax.xml.bind.JAXBException: class uk.org.infectogenomics.model.rest.MySequenceListWrapper nor any of its super class is known to this context.]
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author lorddoskias
 */
@XmlRootElement
public class MySequenceListWrapper {

    @XmlElement(name = "List")
    private List<Sequence> list;

    public MySequenceListWrapper() {/*JAXB requires it */

    }

    public MySequenceListWrapper(List<Sequence> list) {
        this.list = list;
    }

    public List<Sequence> getList() {
        return list;
    }
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({MySequenceListWrapper.class})
public class Request {
    ...
}