it-swarm-id.com

Penulis badan pesan untuk tipe Java, class myPackage.B, dan tipe media MIME, application/octet-stream, tidak ditemukan

Saya baru di layanan web RESTful dan berusaha memperbarui hubungan @OneToMany saya dari aplikasi klien mandiri, tetapi saya tidak dapat melakukannya. Saya menggunakan implementasi Jersey JAX-RS yang dikirimkan dengan Glassfish 3.1.1.

Saya memiliki kelas A yang memiliki hubungan @OneToMany dengan kelas B

MyRestClient adalah klien mandiri saya yang memanggil layanan web RESTful saya yang telah digunakan di Glassfish 3.1.1.

MyRestClient.Java

public class MyRestClient {
    public static void main(String[] args) {    
        Client client = Client.create();        
        WebResource resource = client.resource("http://localhost:8080/myapp/rest/a/update/123");    
        B b1 = new B("debris");     
        ClientResponse response = resource.put(ClientResponse.class, b1);
        System.out.println(response.getEntity(A.class).getTitle() + " has " + response.getEntity(A.class).getBList().size() + " Bs.");
    }
}

AResource adalah sesi kacang EJB yang saya gunakan sebagai layanan web RESTful.

AResource.Java

@Stateless
@Path("/a")
public class AResource {

    @EJB
    private AManager aManager;

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    @Path("/update/{id}")
    public Response updateA(B b, @PathParam("id") int id) {
        A a = aManager.findAById(id);
        a.addB(b);
        return Response.status(Status.OK).entity(a).build();
    }
}

Ketika saya menjalankan klien saya mendapatkan pesan kesalahan berikut: com.Sun.jersey.api.client.ClientHandlerException: Penulis badan pesan untuk tipe Java, kelas myPackage.B, dan jenis media MIME, aplikasi/oktet -stream, tidak ditemukan .

Berikut ini adalah objek domain dalam aplikasi klien mandiri saya yang melakukan panggilan ke sesi kacang EJB AResource yang saya gunakan sebagai layanan web RESTful.

A.Java

@XmlRootElement
public class A implements Serializable{ 

    private List<B> bList = new ArrayList<B>();
    public List<B> getBList() {
        return bList;
    }
    //remaining code

}

B.Java

public class B implements Serializable {

    private String text;
    private A a;    


    @XmlTransient
    public A getA() {
        return a;
    }

    public void afterUnmarshal(Unmarshaller u, Object parent) {
        this.a = (A) parent;
    }
    //remaining code

}

Bisakah seseorang membantu saya memahami mengapa ini terjadi dan bagaimana saya harus menyelesaikan masalah ini?

28
skip

Dalam kode klien Anda, Anda tidak menentukan tipe konten dari data yang Anda kirim - jadi Jersey tidak dapat menemukan MessageBodyWritter yang tepat untuk membuat serial objek b1.

Ubah baris terakhir dari metode utama Anda sebagai berikut:

ClientResponse response = resource.type(MediaType.APPLICATION_XML).put(ClientResponse.class, b1);

Dan tambahkan penjelasan @XmlRootElement ke kelas B di kedua server serta sisi klien.

30
Martin Matula

Masukkan dependensi ini ke POM.xml Anda dan jalankan Maven -> Update

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
   <groupId>com.owlike</groupId>
   <artifactId>genson</artifactId>
   <version>0.99</version>
</dependency>
4
borchvm

Anda perlu menentukan @Provider yang @Produces(MediaType.APPLICATION_XML) dari B.class
Tambahkan paket MessageBodyWriter<B.class> Anda ke /WEB_INF/web.xml Anda sebagai: 

<init-param>
<param-name>com.Sun.jersey.config.property.packages</param-name>
<param-value>
your.providers.package
</param-value>
</init-param>

Menambahkan referensi ke:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>${jersey1.version}</version>
</dependency>

Selama menambahkan clientConfig.getFeatures (). Put (JSONConfiguration.FEATURE_POJO_MAPPING, true); pada pembuatan klien memecahkan masalah bagi saya:

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
Client client = Client.create(clientConfig);
1
llatinov

Anda harus melakukan dua hal untuk menghapus kesalahan ini.

  1. Pemetaan @xmlElement dalam model
  2. Sisi klien:

    response = resource.type(MediaType.APPLICATION_XML).put(ClientResponse.class, b1); //consume

    atau

    response = resource.accept(MediaType.APPLICATION_XML).put(ClientResponse.class, b1); //produce

1
jaskirat Singh

saya menghadapi masalah yang sama untuk metode get saya mengembalikan "int" untuk metode @get Anehnya ketika saya mengubah tipe kembali ke String kesalahan itu hilang. Beri saya mencoba dan jika seseorang tahu logika di baliknya silakan berbagi saya t 

Pastikan semua lib ini ada di jalur kelas Anda:

compile(group: 'com.Sun.jersey', name: 'jersey-core',        version: '1.19.4') 
compile(group: 'com.Sun.jersey', name: 'jersey-server',      version: '1.19.4') 
compile(group: 'com.Sun.jersey', name: 'jersey-servlet',     version: '1.19.4')
compile(group: 'com.Sun.jersey', name: 'jersey-json',        version: '1.19.4')
compile(group: 'com.Sun.jersey', name: 'jersey-client',      version: '1.19.4')
compile(group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1')
compile(group: 'org.codehaus.jackson', name: 'jackson-core-asl', version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-mapper-asl', version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-core-asl',   version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-jaxrs',      version: '1.9.2')
compile(group: 'org.codehaus.jackson', name: 'jackson-xc',         version: '1.9.2')

Tambahkan "Pemetaan Pojo" dan "Penyedia Jackson" ke konfigurasi klien jersey:

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getClasses().add(JacksonJsonProvider.class);

Ini selesaikan bagiku!

ClientResponse response = null;

response = webResource
        .type(MediaType.APPLICATION_JSON)
        .accept(MediaType.APPLICATION_JSON)
        .get(ClientResponse.class);


if (response.getStatus() == Response.Status.OK.getStatusCode()) {

    MyClass myclass = response.getEntity(MyClass.class);
    System.out.println(myclass);
}
0
Jadson Santos

Ini juga terjadi jika Anda kehilangan konstruktor publik kosong untuk Entity (bisa untuk JSON, XML dll).

0
vmhacker

Ini juga dapat terjadi jika Anda baru saja meningkatkan Semut. Saya menggunakan Ant 1.8.4 pada sebuah proyek, dan memutakhirkan Ant menjadi 1.9.4, dan mulai mendapatkan kesalahan ini saat membuat tabung lemak menggunakan Ant.

Solusi bagi saya adalah menurunkan versi kembali ke Ant 1.8.4 untuk baris perintah dan Eclipse menggunakan proses yang dijelaskan di sini

0
Brad Parks

Ini menyelesaikan masalah saya.

http://www.markhneedham.com/blog/2012/11/28/jersey-com-Sun-jersey-api-client-clienthandlerexception-a-message-body-reader-for-Java-class-and- mime-media-type-applicationjson-was-not-found/

Termasuk dependensi berikut di POM.xml Anda dan jalankan Maven -> Update juga memperbaiki masalah saya.

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.19.1</version>
</dependency>
<dependency>
   <groupId>com.owlike</groupId>
   <artifactId>genson</artifactId>
   <version>0.99</version>
</dependency>
0
choom