Ich erstelle eine kleine REST API und ich habe ein Problem mit POST-Methode, wo verbrauchen und produzieren MediaType.APPLICATION_JSON
. Wenn ich POST-Server (Glassfish 4.1.1) senden gibt den Statuscode 500 Internal Server Error sowie die folgenden Fehler:Java Jersey REST NoSuchMethodError: XMLUnmarshaller
java.lang.NoSuchMethodError: org.eclipse.persistence.oxm.XMLUnmarshaller.setNamespaceResolver(Lorg/eclipse/persistence/oxm/NamespaceResolver;)V
las ich diese post und änderte die Version org.eclipse.persistance.moxy
. Es löst mein Problem nicht.
Ich verwende Maven und meine Abhängigkeit sieht tatsächlich wie folgt aus:
<dependencies>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.26</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.16</version>
</dependency>
</dependencies>
Bitte helfen Sie mir dieses Problem zu lösen.
Bearbeiten. Es ist Beispielcode von POST-Methode:
import java.net.URI;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.validation.Valid;
import javax.ws.rs.BeanParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
@Path("/adverts")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class AdvertsResources {
@POST
public void addAdvert(@Suspended final AsyncResponse asyncResponse,
@Valid final Advert advert,
@Context final UriInfo uriInfo) {
executorService.submit(new Runnable() {
@Override
public void run() {
asyncResponse.resume(doAddAdvert(advert, uriInfo));
}
});
}
private Response doAddAdvert(@Valid Advert advert,
@Context UriInfo uriInfo) {
Advert newAdvert = advertService.addAdvert(advert);
String newId = String.valueOf(newAdvert.getId());
URI newUri = uriInfo.getAbsolutePathBuilder().path(newId).build();
return Response.created(newUri)
.entity(newAdvert)
.build();
}
}
@EDIT
Hallo,
ich mein Problem mit JSON und POST-Methode lösen. Was ich mache:
1) Veränderung Glassfish 4.1.1 auf Glassfish 4,1
2) In Abhängigkeit
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-binding</artifactId>
<version>2.26</version>
</dependency>
Danke für den Kommentar. Ich versuche, alle Klassen neu zu kompilieren und Abhängigkeit zu ändern, aber es funktioniert immer noch nicht. Ich bearbeite meinen ersten Beitrag und füge einen Beispielcode der POST-Methode hinzu. – atezor
@atezor Bitte beachten Sie, 'NoSuchMethodError' ist ein 'Fehler', was bedeutet, dass es nur zur Laufzeit auftritt. Sie müssen also sicherstellen, dass Sie zur Laufzeit dieselbe Bibliothek (sogar deren Version) haben. – Ravi