2

私はRESTfulWebサービスを構築するためにJerseyFramework(JAX-RS実装)を使用しています。

@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

すべてのタイプのリクエストに対して 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(...)

このメソッドでは、を返さないでくださいString

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

@DELETEメソッドの戻り値の型は である必要がありますvoid。返品は一切できません。成功すると、応答ステータスは200 または 204になります。

于 2012-10-01T13:19:06.377 に答える
0

Java 1.7で同じ問題に遭遇しました.JDK1.8で動作します

于 2015-08-27T09:51:22.820 に答える