2

これがジェネリックリクエストを保持する私のRequestクラスです:

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

簡潔にするために一部の部分は省略されていますが、本質はそこにあります。次に、次のシーケンスクラスがあります。

import javax.xml.bind.annotation.XmlRootElement;

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

    private String sequenceName;
    private long numReads;
    private int sequenceLength;

    public Sequence() {
        /* Required by JAXB */
    }

    public Sequence(String name, long numReads, int length) {
        sequenceName = name;
        this.numReads = numReads;
        sequenceLength = length;
    }

    public long getNumReads() {
        return numReads;
    }

    public void setNumReads(long numReads) {
        this.numReads = numReads;
    }

    public int getSequenceLength() {
        return sequenceLength;
    }

    public void setSequenceLength(int sequenceLength) {
        this.sequenceLength = sequenceLength;
    }

    public String getSequenceName() {
        return sequenceName;
    }

    public void setSequenceName(String sequenceName) {
        this.sequenceName = sequenceName;
    }
}

そして、私はそのようなことをします:

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

        client.insertIndividualStatistics(PostRequest.assemblyIndividualStats(66, seq));

insertIndividualStatisticsメソッドは次のとおりです。

public static Request assemblyIndividualStats(int stepId, List<Sequence> l) {

    Request req = new Request();
    req.setResourcePath("/stats/assembly/individual");

    req.addParameter("id", String.valueOf(stepId));
    req.setRequestBody(l);

    return req;
}

そして、私がしようとするWebResource res = client.resource(bla).path("my-path").post(req); と:

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.]

ルートオブジェクトでない場合、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;
    }
}

そして、それをrequestBodyとして設定しますが、同様の例外が発生しますが、ArrayListが認識されないという代わりに、MySequenceListWrapperが認識されないということです。Blaise Doughanブログの記事を読みましたが、適切なXmlAnyElementアノテーションがあるので、少なくとも後者の場合は機能するはずです。

4

1 に答える 1

1

JAX-RSを使用して、クラスを認識するContextResolverを作成できます。または、次のようにアノテーションを活用できます。JAXBContextMySequenceListWrapper@XmlSeeAlso

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({MySequenceListWrapper.class})
public class Request {
    ...
}
于 2012-04-26T15:57:08.310 に答える