2016-06-01 7 views
1

Ich benutze Resteasy. Hier ist ein Code zum Löschen einer Ressource.Pass Request Parameter zu löschen Anfrage im Ruhezustand

@DELETE 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
@Path("/{id:\\d+}") 
public Response removeResource(@PathParam("id") int id){ 
    ......................... 
    .. code to delete resource and return Response object .. 
    ......................... 
} 

Dieser Code funktioniert einwandfrei. Aber wenn ich versuche, einen Parameter zu übergeben, um die Anfrage zu löschen. Ich bekomme UnsupportedMediaException

@DELETE 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
@Path("/{id:\\d+}") 
public Response removeResource(@PathParam("id") int id, Map<String, Object> source){ 
    ......................... 
    .. code to delete resource and return Response object .. 
    ......................... 
} 

Ich muss einige Parameter aus irgendeinem Grund senden. Außerdem, wenn ich nur delete Anfrage mit put Anfrage ersetzen, d. H. @DELETE durch @PUT ersetzen, funktioniert der Code gut.

Gibt es eine Möglichkeit, Parameter zum Löschen der Anfrage zu übergeben.

Und am vorderen Ende war ich AngularJS den $ Ressource mit DELETE Anfrage

var r = $Resource(/rest/resources/1); // for debugging purpose I made id 1 
r.remove({"key1":"data1", "key2", "data2"}); 

bearbeiten senden: vom Server
Stapelüberwachung

11:43:25,767 ERROR [org.jboss.resteasy.resteasy_jaxrs.i18n] (default task-7) RESTEASY002010: Failed to execute: javax.ws.rs.NotSupportedException: RESTEASY003065: Cannot consume content type 
at org.jboss.resteasy.core.registry.SegmentNode.match(SegmentNode.java:382) 
at org.jboss.resteasy.core.registry.SegmentNode.match(SegmentNode.java:116) 
at org.jboss.resteasy.core.registry.RootNode.match(RootNode.java:43) 
at org.jboss.resteasy.core.registry.RootClassNode.match(RootClassNode.java:48) 
at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:445) 
at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:257) 
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:194) 
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221) 
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) 
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) 

Verhalten am Front-End-

Status Code: 415 Unsupported Media Type 
Connection: keep-alive 
Content-Length: 0 
Date: Wed, 01 Jun 2016 06:13:25 GMT 
Server: WildFly/10 
x-powered-by: Undertow/1 
+0

Können Sie die komplette stacktrace zeigen –

+0

auch einige Server nicht Unterstütze einen Körper mit DELETE. Obwohl die 'UnsupportedMediaException' wie eine RESTEasy-Ausnahme aussieht, tritt der Fehler auf Anwendungsebene auf. Ich bin mir nicht sicher, welche Regeln RESTEasy diesbezüglich hat. Im schlimmsten Fall senden Sie einfach die Daten in den Abfrageparametern –

+0

@peeskillet Ich fügte Stacktrace des Webservers und Antwort am vorderen Ende hinzu – afzalex

Antwort

1

Sie haben angefordert, dass der Inhaltstyp "application/json" AngularJS defaults an text/plain lautet.

Wenn Sie eine ausreichend neue Version von AngularJS (1.1.3) haben, können Sie das Ressourcenobjekt so anpassen, dass es den angeforderten Inhaltstyp enthält. sollten Sie in der Lage sein, Ihre Ressourcendefinition ändern, um die Content-Type für eine Löschanfrage Für mehr Informationen

var r = $Resource(/rest/resources/1, {}, 
    remove:{ 
     method:"DELETE", 
     isArray:false, 
     headers:{'Content-Type':'application/json; charset=UTF-8'} 
    } 
); 

aufzunehmen siehe Answer One und Angular issue