2017-04-25 252 views
1

我正在使用Jersey的API工作,并希望将其部署到Google App Engine。但是,当我测试邮差,GET功能工作,但不是POST功能。我只收到一条简短的错误消息,即“错误415不支持的介质类型”,我无法确定哪里出错。GET工作POST不工作

package com.yihwei95.gatewaynetworkinterface.resource; 

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.MediaType; 
import javax.ws.rs.core.Response; 

import com.yihwei95.gatewaynetworkinterface.model.AppDataRequest; 
import com.yihwei95.gatewaynetworkinterface.service.AppDataService; 

@Path("/v1/") 
public class AppDataResource { 
    AppDataService ads = new AppDataService(); 

    @Produces(MediaType.APPLICATION_JSON) 
    @GET 
    @Path("/v2") 
    public String getAppData(){ 
     return "No"; 
    } 

    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    @POST 
    @Path("/v3") 
    public Response getSAppData(AppDataRequest adr) { 
     Response data = ads.getSAppData(adr.getId(), adr.getEmail(), adr.getPassword()); 
     return data; 
    } 
} 

请求资源类

package com.yihwei95.gatewaynetworkinterface.service; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.ws.rs.core.Response; 

import com.google.gson.Gson; 
import com.yihwei95.gatewaynetworkinterface.model.AppData; 
import com.yihwei95.gatewaynetworkinterface.model.AppDataRequest; 
import com.yihwei95.gatewaynetworkinterface.model.Data; 

public class AppDataService { 
    Map<AppDataRequest, Data> DataHM = new HashMap<>(); 

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
    static final String DB_URL = "jdbc:mysql://****:3306/demo"; 

    static final String USER = "****"; 
    static final String PASS = "****"; 

    public AppDataService(){ 
     Connection conn = null; 
     Statement stat = null; 
     try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      stat = conn.createStatement(); 
      String sql = "SELECT * FROM testdata"; 
      ResultSet resu = stat.executeQuery(sql); 
      while(resu.next()){ 
       int id = resu.getInt("app_id"); 
       String email = resu.getString("email"); 
       String password = resu.getString("password"); 
       String token = resu.getString("token"); 
       DataHM.put(new AppDataRequest(id, email, password), new Data(token)); 
      } 
      resu.close(); 
      stat.close(); 
      conn.close(); 
     } 
     catch(SQLException se){ 
      se.printStackTrace(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     finally{ 
      try{ 
       if(stat!=null){ 
        stat.close(); 
       } 
      } 
      catch (SQLException se2){ 
       se2.printStackTrace(); 
      } 
      try{ 
       if(conn!=null){ 
        conn.close(); 
       } 
      } 
      catch(SQLException se3){ 
       se3.printStackTrace(); 
      } 
     }  
    } 

    public Response getSAppData(int id, String email, String password){ 
     Map<String, AppData> AppDataHM = new HashMap<>(); 
     Map<String, Data> DataHM1 = new HashMap<>(); 
     Map<String, List<String>> DataHM2 = new HashMap<>(); 
     HashMap<Object, Object> ADHMDHM = new HashMap<>(); 

     List<String> message = new ArrayList<>(); 
     Data data = DataHM.get(new AppDataRequest (id, email, password)); 
     List<String> data2 = new ArrayList<>(); 

     if(data != null){ 
      message.add(""); 
      AppDataHM.put("AppData", new AppData("success", message)); 
      DataHM1.put("Data", data); 
      ADHMDHM.putAll(AppDataHM); 
      ADHMDHM.putAll(DataHM1); 
      String ADHMDHM1 = new Gson().toJson(ADHMDHM); 
      return Response.status(200).entity(ADHMDHM1).build(); 
     } 
     else{ 
      message.add("Your login information is invalid. Please try with the correct information"); 
      AppDataHM.put("AppData", new AppData("error", message)); 
      DataHM2.put("Data", data2); 
      ADHMDHM.putAll(AppDataHM); 
      ADHMDHM.putAll(DataHM2); 
      String ADHMDHM2 = new Gson().toJson(ADHMDHM); 
      return Response.status(200).entity(ADHMDHM2).build(); 
     } 
    } 
} 

请求服务类

<servlet> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.yihwei95.gatewaynetworkinterface.resource</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <url-pattern>/api/*</url-pattern> 
</servlet-mapping> 

WEB.XML

POSTman Error

预先感谢everyo ne帮助我指出并解决问题并回答我的问题。

+0

你可以请分享异常跟踪 –

+0

嗨。 @SaurabhJhunjhunwala介意我问我如何获得异常跟踪?它来自控制台? –

+0

看看服务器日志,它会告诉你发生了什么。你在使用哪台服务器 –

回答

0

添加此dependecy

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>JERSEY_VERSION</version> 
</dependency> 
+0

嗨。 @WilderValera。我没有pom.XML。请介意我应该如何在web.XML上添加该内容?从#HarishVashist的第3步添加一个jar就足够了吗? –

+0

Harish的评论指的是与你不同的包,所以你应该添加相同的你,我的意思是org.glassfish.jersey而不是com.sun.jersey。如果我是你,我会尝试从Maven仓库下载jar(使用相同的Jersey版本搜索依赖项)。尝试一下。 –

+0

例如:https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson/2.22.1,即泽西岛2.22.1。在那里你可以看到依赖信息和一个链接来下载jar。 –

0

,当你试图打资源不被与资源消耗基于问题的细节,预计 没有很好地形成正确的有效载荷,即数据的提供,此问题occures共享的问题可以是以下任何一种:

  1. 对于邮差客户端,您没有指定正确的内容类型。在你的情况下,它必须是Content-Type: application/jsonAccept: application/json在REST客户端标题部分。
  2. 的问题是在bean AppDataRequest的反序列化,其中的原因似乎是bean类不与@JsonCreater@JsonProperty注解,因为它的模型AppDataRequest要发送的合式JSON数据未能得到反序列化annoted好在资源方面。
  3. 如果你确信你点1和2均不适用于您然后确保你已经添加了杰克逊依赖其解析JSON对象,如:

    com.sun.jersey 球衣-json 1.8

您可以按照在球衣实施JAX-RS的:http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

+0

嗨。 @HarishVashist感谢您的帮助。我跟着第一步,它不工作,因为它返回相同的415错误代码。关于第二步,我收到JsonCreater的错误,JsonProperty无法解析为类型。我应该为两个注释导入任何jar吗?第三步,我将Jackson jar添加到了我的构建路径中。对于你包含的链接,我发现com.sun.jersey.api.json.POJOMappingFeature不再可用于Jersey 2,这是真的吗? –