Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在REST/JERSEY中调用@DELETE web服务_Java_Web Services_Rest_Jersey - Fatal编程技术网

Java 无法在REST/JERSEY中调用@DELETE web服务

Java 无法在REST/JERSEY中调用@DELETE web服务,java,web-services,rest,jersey,Java,Web Services,Rest,Jersey,我正在使用Jersey框架(JAX-RS实现)构建RESTful Web服务 我无法使用@DELETE REST方法,因为当我尝试调用它时,它会引发异常。以下@DELETE方法用于删除员工: @Path("/employees") public class EmpResource { @DELETE @Consumes(MediaType.APPLICATION_JSON) public Response deleteEmployee(JAXBElement<String> r)

我正在使用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();    
当我运行客户端时,它抛出以下异常:

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)
如果有人能指导我如何解决它,那就太好了。

正如错误所说

HTTP方法DELETE不支持输出

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

public Response deleteEmployee(...)
在方法中,不要返回
字符串
,例如

return Response.noContent().build();

@DELETE
方法的返回类型应为
void
。你不能归还任何东西。成功后,响应状态将为can

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

ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).delete(ClientResponse.class);
而是通过@pathParam发送:

public String delete(@PathParam("input") String input){...}

我通常使用DELETE,比如void:

@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
就像这里:


这里:

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

它应该用java 8解决

同时,实际上,要向REST服务发送json,您必须发送@Micer says之类的路径参数,或者创建自己的HttpUrlConnection,将requestmethod设置为POST,并使用“X-HTTP_method-Override”覆盖它,以表示您希望执行以下操作:

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

来源:

这似乎是因为HttpURLConnection类的Java 1.7实现中存在一个bug()。我试着使用JDK1.8,效果非常好。

花了一些时间试图确定使用WebLogic 12和Sun/JRocket 1.6目前哪些是有效的,哪些是无效的

错误“ProtocolException:HTTP方法删除不支持输出”似乎有点误导。此错误不是因为从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类的源代码。此错误在方法未放置或发布时产生,但仅在协议为“http”时产生。启用并将客户端指向容器上的安全端口,最后一个示例(导致异常的示例)成功运行。让我想知道这是否真的是一些人建议的java bug。

我确实在java 1.7中遇到了同样的问题。它在JDK1.8中工作

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

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

克斯菲尔特
org.apache.catalina.filters.CorsFilter
科尔斯
*
cors.methods
获取、发布、标题、选项、放置、删除
克斯菲尔特
/*

在Jersey Client 2.x.x中,使用有效负载删除可以正常工作

客户端代码示例如下

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

尝试了上述操作,但仍然是相同的异常。有什么想法吗?不是真的。服务器端很好。可以使用Jersey创建delete方法并使用postmann查看响应您的应用程序如何处理未捕获的异常?Is
DAOaccess.deleteEmp(name)引发异常?@DavidGrant没有。它没有进入方法。这是一个java错误,在java 8中已修复。请您再解释一下好吗?@Saurabh我从
delete()
方法中删除了输入(
String input=“{\'name\”:\'John\”});
)参数,并在方法声明中将其指定为
@PathParam
。应该很严格。
    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);
}