it-swarm.com.de

Ein Nachrichtentextsteller für den Java-Typ, Klasse myPackage.B, und der MIME-Medientyp application/octet-stream wurde nicht gefunden

Ich bin neu bei RESTful webservices und habe versucht, meine @OneToMany-Beziehung von einer eigenständigen Clientanwendung aus zu aktualisieren. Dies kann ich jedoch nicht. Ich verwende die Jersey-Implementierung von JAX-RS, die mit Glassfish 3.1.1 ausgeliefert wird.

Ich habe eine Klasse A, die eine @OneToMany-Beziehung zur Klasse B hat. 

MyRestClient ist mein Standalone-Client, der meinen RESTful-Webservice auf Glassfish 3.1.1 aufruft.

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 ist eine EJB-Session-Bean, die ich als RESTful-Webservice verwende.

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

Wenn ich den Client starte, erhalte ich die folgende Fehlermeldung: com.Sun.jersey.api.client.ClientHandlerException: Ein Nachrichtentext für Java-Typ, Klasse myPackage.B und MIME-Medientyp application/octet -stream wurde nicht gefunden .

Nachfolgend sind die Domänenobjekte in meiner eigenständigen Clientanwendung aufgeführt, die die AResource EJB-Session-Bean aufruft, die ich als RESTful-Webservice verwende.

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

}

Könnte mir jemand helfen zu verstehen, warum dies geschieht und wie ich dieses Problem lösen sollte?

28
skip

In Ihrem Client-Code geben Sie nicht den Inhaltstyp der gesendeten Daten an. Jersey kann also nicht den richtigen MessageBodyWritter für die Serialisierung des Objekts b1 finden.

Ändern Sie die letzte Zeile Ihrer Hauptmethode wie folgt:

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

Fügen Sie @XmlRootElement-Annotation zu Klasse B sowohl auf dem Server als auch auf der Clientseite hinzu.

30
Martin Matula

Fügen Sie diese Abhängigkeiten in Ihre POM.xml ein und führen Sie Maven -> Update aus

<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

Sie müssen den @Provider angeben, den @Produces(MediaType.APPLICATION_XML) von B.class
.__ Fügen Sie das Paket Ihres MessageBodyWriter<B.class> zu Ihrem /WEB_INF/web.xml hinzu: 

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

Referenz hinzufügen zu:

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

Solange das Hinzufügen von clientConfig.getFeatures (). Put (JSONConfiguration.FEATURE_POJO_MAPPING, true); on client creation löste das Problem für mich:

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

Sie müssen zwei Schritte ausführen, um diesen Fehler zu beheben.

  1. Die @xmlElement Zuordnung im Modell
  2. Die Client-Seite:

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

    oder

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

1
jaskirat Singh

ich stand vor dem gleichen Problem für eine Get-Methode. Ich gab ein "Int" für die @get-Methode zurück. Seltsamerweise, wenn ich den Rückgabetyp in String ändere, war der Fehler verschwunden. Versuchen Sie es und wenn jemand die Logik kennt, teilen Sie dies bitte mit es 

Stellen Sie sicher, dass sich alle diese Bibliotheken in Ihrem Klassenpfad befinden:

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')

Fügen Sie der Jersey-Client-Konfiguration "Pojo-Mapping" und "Jackson Provider" hinzu:

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

Das löse mich!

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

Dies geschieht auch, wenn Sie einen leeren öffentlichen Konstruktor für die Entität vermissen (möglicherweise für JSON, XML usw.).

0
vmhacker

Dies kann auch passieren, wenn Sie Ant kürzlich aktualisiert haben. Ich habe Ant 1.8.4 in einem Projekt verwendet und Ant auf 1.9.4 aktualisiert. Ich habe beim Erstellen eines fetten Gefäßes mit Ant diese Fehlermeldung erhalten.

Die Lösung für mich bestand darin, für die Befehlszeile und für Eclipse auf Ant 1.8.4 zurückzusteigen, wobei der hier beschriebene Prozess verwendet wurde.

0
Brad Parks

Das hat mein Problem gelöst.

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

Wenn Sie die folgenden Abhängigkeiten in Ihre POM.xml aufnehmen und Maven ausführen -> Update, wurde auch mein Problem behoben.

<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