2

我正在使用 Jersey 框架(JAX-RS 实现)来构建 RESTful Web 服务。

我无法使用@DELETE REST 方法,因为当我尝试调用它时它会抛出异常。以下@DELETE 方法用于删除员工:

@Path("/employees")
public class EmpResource {

@DELETE
@Consumes(MediaType.APPLICATION_JSON)
public Response deleteEmployee(JAXBElement<String> r) throws ClassNotFoundException, SQLException {

    String name = r.getValue();
    String response = DAOaccess.deleteEmp(name);
    return Response.noContent().build();    

}

我正在使用以下代码块来调用服务:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/RestApp/sample/employees");
String input = "{\"name\":\"John\"}";
ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).delete(ClientResponse.class,input);

当我运行我的客户端时,它会引发以下异常:

Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.net.ProtocolException: HTTP method DELETE doesn't support output
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.delete(WebResource.java:599)

如果有人可以指导我如何解决它会很棒吗?

4

10 回答 10

12

这是 HTTPUrlConnection 类的实现中的 java 的错误:

http://bugs.sun.com/view_bug.do?bug_id=7157360

它应该在java 8中解决......

同时,实际上,要将 json 发送到 REST 服务,您必须像 @Micer 所说的那样发送路径参数,或者让您自己的 HttpUrlConnection 将 requestmethod 设置为 POST 并用“X-HTTP_method-Override”覆盖它说你想要一个 DELETE 做这样的事情:

  public static void remove(String dflowname) throws IOException, ParseException {
    String jsonResponse = "";

    URL url = new URL(deleteuri);
    HttpURLConnection connection = null;
    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    // We have to override the post method so we can send data
    connection.setRequestProperty("X-HTTP-Method-Override", "DELETE");
    connection.setDoOutput(true);

    // Send request
    OutputStreamWriter wr = new OutputStreamWriter(
      connection.getOutputStream());
    wr.write(dflowname);
    wr.flush();

    // Get Response
    BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
      jsonResponse = jsonResponse.concat(line);
    }
    wr.close();
    rd.close();

    JSONParser parser = new JSONParser();
    JSONObject obj = (JSONObject) parser.parse(jsonResponse);
    System.out.println(obj.get("status").toString());
  }

来源:https ://groups.google.com/a/openflowhub.org/forum/#!msg/floodlight-dev/imm_8drWOwU/Uu4h_u3H6HcJ

于 2013-11-19T15:37:27.550 回答
4

对我来说,它有助于从客户端的 delete() 方法中删除输入参数

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

而是通过@pathParam 发送它:

public String delete(@PathParam("input") String input){...}
于 2012-10-04T17:32:25.987 回答
2

使用有效负载删除在 Jersey 客户端 2.xx 中工作正常

下面的客户端代码示例。

    public CalculateResult unoverrideSubscription(String partyId, String serviceCode) {


    CalculateResult svc = r.path("/party-subscriptions").path(partyId)
            .path(serviceCode)
            .path("price")
            .request(MediaType.APPLICATION_JSON).delete(CalculateResult.class);

    return svc;// toGenericResponse(sr);
}
于 2016-07-06T15:22:29.160 回答
1

这似乎是因为 HttpURLConnection 类的 Java 1.7 实现中的一个错误(https://bugs.openjdk.java.net/browse/JDK-7157360)。我尝试使用 JDK1.8,它就像一个魅力。

于 2014-05-23T18:09:58.267 回答
1

花了一些时间尝试确定使用 WebLogic 12 和 Sun / JRocket 1.6 当前可以工作和不能工作的内容。

错误“ProtocolException:HTTP 方法 DELETE 不支持输出”似乎有点误导。此错误不是由从 RS 返回输出引起的,而是由于尝试传入要在删除请求上处理的对象而引起的。

通过@QueryParams 传入键/标识符时,您可以接收对象...

@DELETE
@Path("deleteThis")
public Response deleteThis(@QueryParam("objectId") String objectId)

using

    ClientResponse response = webResource.path("deleteThis").queryParam("objectId", "1").delete(ClientResponse.class);

或通过@PathParams ...

@DELETE
@Path("deleteThis/{objectId}")
public ReturnedObject deleteThis(@PathParam("objectId") int objectId)

using

    ReturnedObject myReturnedObject = webResource.path("deleteThis").path("1").delete(ReturnedObject.class);

当您传入要用作参数的对象时会产生此错误

@DELETE
@Path("deleteThis")
public Response deleteRuleSettingTest(ArgumentObject myObject)

using

ArgumentObject myArgumentObject = ...
ClientResponse response = webResource.path("deleteThis").delete(ClientResponse.class, myArgumentObject);

此外。查看了 sun.net.www.protocol.http.HttpURLConnection 类的源代码。当方法不是 PUT 或 POST 但仅当协议为“http”时会产生此错误。启用并将我的客户端指向容器上的安全端口,最后一个示例(导致异常的示例)成功运行。让我想知道这是否真的像一些人所建议的那样是一个 java 错误。

于 2014-10-07T23:18:50.830 回答
1

您必须为所有类型的请求创建一个过滤器

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
于 2015-09-22T08:56:42.497 回答
0

正如错误所说,

HTTP 方法 DELETE 不支持输出

因此,您必须将方法的签名更改为

public Response deleteEmployee(...)

在方法中不返回 aString但例如

return Response.noContent().build();
于 2012-10-01T09:08:52.847 回答
0

方法的返回类型@DELETE应该是void. 你不能退回任何东西。成功后,响应状态可以是200 或 204

于 2012-10-01T13:19:06.377 回答
0

我通常像 void 一样使用 DELETE:

@DELETE
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("/")
public void deleteSomeBean(@QueryParam("id") String id) throws Exception

在客户端:

webResource.path(SERVICE_PATH).queryParam("id", someBean.getId()).delete();gith

喜欢这里:TemplateRestService

在这里:TemplateServiceRestTest

于 2013-07-22T21:08:04.020 回答
0

我确实遇到了与 Java 1.7 相同的问题。它适用于 JDK1.8

于 2015-08-27T09:51:22.820 回答