これがジェネリックリクエストを保持する私の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アノテーションがあるので、少なくとも後者の場合は機能するはずです。