我正在尝试在tomcat服务器中使用Jersey创建一个rest API,我的应用程序从其他服务(没有数据库)收集输入。 我创建了以下pojos:
//this a pojo for parameters the application takes in the @POST request, a location lat/long
@XmlRootElement
public class DestLatLong {
private String lat;
private String lng;
public DestLatLong(){}
public String getLat() {
return lat;
}
public void setLat(String lat) {
this.lat = lat;
}
public String getLng() {
return lng;
}
public void setLng(String lng) {
this.lng = lng;
}
}
这些是将包含在响应中的值,即到达给定位置的票价:
public class DestPriceResponse {
public DestPriceResponse() {
}
public String airport;
public String currency;
public String price;
public String getAirport() {
return airport;
}
public void setAirport(String airport) {
this.airport = airport;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
我是否需要在此处使用地图,以便pojo正确映射到JSON?或者这个对象够了吗?
以下是应该处理请求并返回响应的类:
public class DestinationResource {
// Will map the resource to the URL todos
@Path("/api")
public class TodosResource {
// Allows to insert contextual objects into the class,
// e.g. ServletContext, Request, Response, UriInfo
@Context
UriInfo uriInfo;
@Context
Request request;
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public DestPriceResponse getDestPrice(String lat, String lng) {
DestPriceResponse priceResponse = new DestPriceResponse();
NearestAirports nearest = new NearestAirports();
nearest.parseNearestAirports(lat, lng);
return priceResponse;
}
我正在使用的POST请求是:
http://localhost:8080/webapi/rest/api?lat=60&lng=0
,标题有:
Content-Type = application/json
但我一直在接受:
HTTP状态404 - 未找到
输入状态报告
未找到消息
描述源服务器未找到当前表示 对于目标资源或不愿意披露存在的资源。
Apache Tomcat / 8.5.23
我的设置包括:
rootProject.name = 'webapi'
和webxml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>webapi</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers under com.vogella.jersey.first package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>webapi</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
有什么问题,我怎样才能最好地调试它?
答案 0 :(得分:2)
此调用http://localhost:8080/webapi/rest/api?lat=60&lng=0
假设您正在公开在GET
方法参数(lat和lng)上使用@QueryParam()
注释的HTTP getDestPrice()
方法,如下所示:
@GET
@Produces(MediaType.APPLICATION_JSON)
public DestPriceResponse getDestPrice(@QueryParam("lat") String lat, @QueryParam("lng") String lng) {
如果要使用接受数据对象的POST
方法,则应将方法签名更改为以下内容:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public DestPriceResponse getDestPrice(DestLatLong longLat) {
Content-Type: application/json
的标头并传递json
描述DestLatLong
对象Jersey
将在调用api时在运行时为您创建此对象。 您收到错误404,因为/
上没有HTTP GET端点(您定义了POST)