Java REST 服务在 POST 上生成 405
Java REST service generates 405 on POST
我正在开发 JAX-RS REST 服务。我正在使用 Java 1.8、Tomcat 7,并通过 JQuery/AJAX.
调用我的 POST
我的JQuery代码很简单:
$.post(ctx + "/addressinfo/", data, null, "json")
其中数据是包含基本地址信息的简单 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 错误。 post 通过单击表单上的按钮启动。
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)
});
EDIT
I neglected to add the servlet definition for the application's web.xml
<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>
似乎没有任何东西允许我 post 我的 REST 服务。
我的 Tomcat 配置是否需要更改?或者我做错了什么?我想我可以从 REST 服务更改为 servlet,但我宁愿不必那样做。
你的@POST的Java方法是private
,应该是public
。 Jersey 忽略控制器中的私有方法。
saveAddress 只消耗数据不产生
所以实施
@Produces
也在 saveAddress 中
我正在开发 JAX-RS REST 服务。我正在使用 Java 1.8、Tomcat 7,并通过 JQuery/AJAX.
调用我的 POST我的JQuery代码很简单:
$.post(ctx + "/addressinfo/", data, null, "json")
其中数据是包含基本地址信息的简单 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 错误。 post 通过单击表单上的按钮启动。
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)
});
EDIT I neglected to add the servlet definition for the application's web.xml
<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>
似乎没有任何东西允许我 post 我的 REST 服务。
我的 Tomcat 配置是否需要更改?或者我做错了什么?我想我可以从 REST 服务更改为 servlet,但我宁愿不必那样做。
你的@POST的Java方法是private
,应该是public
。 Jersey 忽略控制器中的私有方法。
saveAddress 只消耗数据不产生
所以实施
@Produces
也在 saveAddress 中