我是否需要在tomcat中使用@POST和jersey进行地图

时间:2017-12-03 11:29:42

标签: java json rest tomcat jersey

我正在尝试在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>

有什么问题,我怎样才能最好地调试它?

1 个答案:

答案 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) {
  • 更改您的HTTP调用并使用任何HttpClient(例如Advanced Rest Client chrome扩展程序)
  • 添加Content-Type: application/json的标头并传递json 描述DestLatLong对象
  • Jersey将在调用api时在运行时为您创建此对象。

您收到错误404,因为/上没有HTTP GET端点(您定义了POST)