2015-11-06 47 views
0

当我尝试使用POST向我的Jersey REST服务传递JSON字符串时,REST客户端返回415 - 不支持的媒体类型。通过GET查询资源工作正常。杰克逊不会将JSON字符串序列化为Java对象

实体类:

@Entity 

public class Agent implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

private String name; 

public Agent() { 

} 

public Agent(String name) { 
    this.name = name; 
} 

@OneToMany(mappedBy = "agent", cascade = CascadeType.PERSIST) 
@JsonBackReference 
private List<Action> actions = new ArrayList<>(); 
//...getter/setter... 
} 

服务类REST:

@Path("/agents") 
public class AgentService { 

private static PersistenceFacade f = new PersistenceFacade(); 
private static StatusFacade s = new StatusFacade(); 

//GET all Agents 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public List<Agent> getAllAgents() { 
    return f.getAllAgents(); 
} 

@POST 
@Path("/create") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public void postAgent(Agent a) { 
    f.createAgent(a); 
} 
} 

PersistenceFacade

public class PersistenceFacade { 

//EMF als zentraler Handler für alle EM 
private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("simulationPU"); 

public void createAgent(Agent a) { 
    EntityManager em = factory.createEntityManager(); 
    EntityTransaction tx = em.getTransaction(); 
    tx.begin(); 
    em.persist(a); 
    tx.commit(); 
} 

public List<Agent> getAllAgents() { 
    EntityManager em = factory.createEntityManager(); 
    Query q = em.createQuery("SELECT a FROM Agent a"); 
    List<Agent> aList = q.getResultList(); 
    return aList; 
} 

传递GET请求来http://localhost:8080/simulation_api/agents回报我TESTDATA:

[{"id":2104,"name":"pi3"},{"id":2107,"name":"pi4"}] 

但是,当我尝试使用POST将JSON字符串传递到http://localhost:8080/simulation_api/agents/create时,如上所述发生错误(HTTP响应415)。我把要求的身体内:

{"id":2804,"name":"pi7"} 

可能是什么问题?没有抛出异常......

+2

你是否包括“内容类型:应用程序/ JSON的”头在你的POST请求? –

回答

0

@Don波特斯坦 是的,如果我通过卷曲发送POST请求:

curl -X POST -H "Content-Type: application/json" -d {"id":2804 
,"name":"pi7"} http://localhost:8080/simulation_api/agents/create -v 

然后卷曲的回报:

* Trying ::1... 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 8080 (#0) 
> POST /simulation_api/agents/create HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.45.0 
> Accept: */* 
> Content-Type: application/json 
> Content-Length: 18 
> 
* upload completely sent off: 18 out of 18 bytes 
< HTTP/1.1 500 Request failed. 
< Content-Type: text/html;charset=ISO-8859-1 
< Date: Sat, 07 Nov 2015 09:26:07 GMT 
< Connection: close 
< Content-Length: 1033 
< 

编辑:解

我想通了,有必要通过ObjectMapper类手动将JSON输入字符串转换为对象。 (我认为@Consumes接口做,在后台...)

现在,它的工作原理:

@Path("/agents") 
public class AgentService { 

private static PersistenceFacade f = new PersistenceFacade(); 
private static StatusFacade s = new StatusFacade(); 

//GET all Agents 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public List<Agent> getAllAgents() { 
    return f.getAllAgents(); 
} 

@POST 
@Path("/create") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public void postAgent(String content) throws IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    Agent a = mapper.readValue(content, Agent.class); 
    f.createAgent(a); 
} 
} 
+0

这是由于请求中的内容类型不正确引起的,我想。我有同样的问题,我可以看到,在数据包发送领域被打包成一个字符串... http://stackoverflow.com/questions/43547144/multipart-nodejs-request-with-object-in-it 必须有强制杰克逊自动进行这种转换的方法。 – greengold