2017-04-25 251 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,這是真的嗎? –