【问题标题】:Java REST service generates 405 on POSTJava REST 服务在 POST 上生成 405
【发布时间】:2018-09-10 18:13:18
【问题描述】:

我正在开发 JAX-RS REST 服务。我正在使用 Java 1.8、Tomcat 7,并通过 JQuery/AJAX 调用我的 POST。

我的 JQuery 代码很简单:

$.post(ctx + "/addressinfo/", data, null, "json")

其中 data 是一个包含基本地址信息的简单 JSON 对象。

我的 REST 控制器如下:

package addressservice.controller;

import javax.servlet.*;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.goodyear.menuadmin.plantservice.model.PlantInfo;
import com.goodyear.menuadmin.plantservice.service.PlantInfoService;

@Path("/")
public class AddressController {
    private AddressService service = new AddressService ();
    private Address address;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAddress(@Context ServletContext ctx) throws Exception {
        this.address= plantService.getInfo("Name");

        return Response.ok(this.plant, MediaType.APPLICATION_JSON).build();
    }

    @POST
    @Consumes(MediaType.MEDIA_TYPE_WILDCARD)
    private Response saveAddress(Address data) {
        boolean isOk = addressService.updateInfo(data);

        if(!isOk) {
            Response.serverError().build();
        }

        return Response.ok(data, MediaType.APPLICATION_JSON).build();
    }
}

但是,当我执行此操作时,我收到 405 Method Not Allowed 错误。帖子是通过单击表单的按钮启动的。

GET 部分工作得很好。

响应头是:

HTTP/1.1 405 Method Not Allowed
Server: Apache-Coyote/1.1
Allow: HEAD,GET,OPTIONS
Content-Length: 0
Date: Mon, 10 Sep 2018 17:58:08 GMT

我已经尝试了几种不同的尝试来纠正这个问题,包括将此初始化参数添加到我的 tomcat web.xml

<init-param>
  <param-name>readonly</param-name>
  <param-value>false</param-value>
</init-param>

我尝试将 $.post 更改为以下内容:

return $.ajax({
   url: ctx + "/addressinfo/",
   type: 'post',
   dataType: 'json',
   contentType: 'application/json',
   data: JSON.stringify(data)
});

编辑 我忽略了为应用程序的 web.xml 添加 servlet 定义

  <servlet>
    <servlet-name>Address Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>addressservice.controller</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
      <param-value>true</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Plant Service</servlet-name>
    <url-pattern>/addressinfo/*</url-pattern>
  </servlet-mapping>

似乎没有任何内容允许我发布到我的 REST 服务。

我的 Tomcat 配置有什么需要更改的吗?还是我做错了什么?我想我可以从 REST 服务更改为 servlet,但我宁愿不必这样做。

【问题讨论】:

  • 您正在发布到 /plantinfo,但这与您的资源的 @Path 不匹配。
  • 谢谢@luk2302。请查看我的编辑

标签: java tomcat jersey


【解决方案1】:

@POST 的 Java 方法是 private,它应该是 public。 Jersey 会忽略 Controller 中的私有方法。

【讨论】:

  • 感谢您指出我的无能。我不敢相信我错过了
  • 没问题,这只是一个小疏忽,它发生了......)
【解决方案2】:

saveAddress 只消耗数据不产生

所以实施

@生产

在 saveAddress 中也是如此

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2012-04-23
    • 2023-01-31
    • 2021-03-23
    相关资源
    最近更新 更多