GET工作POST不工作
我正在使用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
预先感谢everyo ne帮助我指出并解决问题并回答我的问题。
添加此dependecy
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>JERSEY_VERSION</version>
</dependency>
嗨。 @WilderValera。我没有pom.XML。请介意我应该如何在web.XML上添加该内容?从#HarishVashist的第3步添加一个jar就足够了吗? –
Harish的评论指的是与你不同的包,所以你应该添加相同的你,我的意思是org.glassfish.jersey而不是com.sun.jersey。如果我是你,我会尝试从Maven仓库下载jar(使用相同的Jersey版本搜索依赖项)。尝试一下。 –
例如:https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson/2.22.1,即泽西岛2.22.1。在那里你可以看到依赖信息和一个链接来下载jar。 –
,当你试图打资源不被与资源消耗基于问题的细节,预计 没有很好地形成正确的有效载荷,即数据的提供,此问题occures共享的问题可以是以下任何一种:
- 对于邮差客户端,您没有指定正确的内容类型。在你的情况下,它必须是
Content-Type: application/json
和Accept: application/json
在REST客户端标题部分。 - 的问题是在bean
AppDataRequest
的反序列化,其中的原因似乎是bean类不与@JsonCreater
和@JsonProperty
注解,因为它的模型AppDataRequest
要发送的合式JSON数据未能得到反序列化annoted好在资源方面。 -
如果你确信你点1和2均不适用于您然后确保你已经添加了杰克逊依赖其解析JSON对象,如:
com.sun.jersey 球衣-json 1.8
您可以按照在球衣实施JAX-RS的:http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
嗨。 @HarishVashist感谢您的帮助。我跟着第一步,它不工作,因为它返回相同的415错误代码。关于第二步,我收到JsonCreater的错误,JsonProperty无法解析为类型。我应该为两个注释导入任何jar吗?第三步,我将Jackson jar添加到了我的构建路径中。对于你包含的链接,我发现com.sun.jersey.api.json.POJOMappingFeature不再可用于Jersey 2,这是真的吗? –
你可以请分享异常跟踪 –
嗨。 @SaurabhJhunjhunwala介意我问我如何获得异常跟踪?它来自控制台? –
看看服务器日志,它会告诉你发生了什么。你在使用哪台服务器 –