Bug MOXyJsonProvider saat membatalkan marshalling array json

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

}


person user2755861    schedule 06.09.2013    source sumber


Jawaban (1)


Catatan: Saya adalah EclipseLink JAXB (MOXy) pemimpin dan anggota JAXB (JSR-222) kelompok ahli.

Anda mengalami bug berikut yang telah kami perbaiki di EclipseLink 2.5.1:

person bdoughan    schedule 09.09.2013