Saya memiliki sumber daya jersey sederhana, UserContentManager, yang memproses kelas ContentInput sederhana. Kedua kelas tersebut berada di bawah. Metode postHello berfungsi dengan baik ketika dipanggil menggunakan curl -X POST -H "Content-Type: application/json" -d '{"id":1,"type":"a"}' localhost:50000/news/rest/hello
tetapi metode putHello gagal ketika dipanggil dengan curl -X PUT -H "Content-Type: application/json" -d '[{"id":1}]' localhost:50000/news/rest/hello
Itu gagal di MOXyJsonProvider:598 (baris yang dicetak tebal di bawah) karena ketika tidak di-marshall, itu di-unmarshall ke ArrayList<Property>
alih-alih ArrayList<JAXBElement<Property>>
seperti yang diharapkan oleh kode, yaitu Nilai objek = jaxbElement.getValue() adalah ArrayList<Property>
bukan ArrayList<JAXBElement>
seperti pemerannya .
Apakah ini bug di Moxy atau saya melakukan kesalahan? Metode getArray berfungsi dengan baik saat mengembalikan array. Saya sudah mencobanya dengan dan tanpa @XmlRootElement pada kelas ContentInput tetapi hasilnya sama.
JAXBElement<?> jaxbElement = unmarshaller.unmarshal(jsonSource, domainClass);
if(type.isAssignableFrom(JAXBElement.class)) {
return jaxbElement;
} else {
Object value = jaxbElement.getValue();
if(value instanceof ArrayList) {
if(type.isArray()) {
ArrayList<JAXBElement> arrayList = (ArrayList<JAXBElement>) value;
int arrayListSize = arrayList.size();
Object array;
if(genericType instanceof GenericArrayType) {
array = Array.newInstance(JAXBElement.class, arrayListSize);
for(int x=0; x<arrayListSize; x++) {
Array.set(array, x, arrayList.get(x));
}
} else {
array = Array.newInstance(domainClass, arrayListSize);
for(int x=0; x<arrayListSize; x++) {
* Array.set(array, x, arrayList.get(x).getValue());*
}
}
return array;
@WebService
@Path("/hello")
public class UserContentManager {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response postHello(ContentInput input) {
input.setId(input.getId());
input.setType("clip" + input.getType());
ResponseBuilder builder = Response.ok();
builder.entity(input);
return builder.build();
}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public ContentInput[] putHello(ContentInput [] input) {
return input;
}
@Path("/array")
@GET
@Produces(MediaType.APPLICATION_JSON)
public ContentInput[] getArray() {
return new ContentInput[] {
new ContentInput(),
new ContentInput()
};
}
}
public class ContentInput {
private int id;
private String type;
public ContentInput() {}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}