0
votes

when I try to pass a JSON-String using POST to my Jersey REST-Service, the REST client returns 415 - Unsupported Media Type. Querying the resource via GET works fine.

Entity class:

@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...
}

Service class for 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;
}

Passing GET-Request to http://localhost:8080/simulation_api/agents returns my testdata:

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

But when I try to pass a JSON-String to http://localhost:8080/simulation_api/agents/create with POST, error occurs as mentioned above(HTTP Response 415). I put inside the request body:

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

What might be the problem? No exception is thrown...

1
Are you including a "Content-type: application/json" header on your POST request? - Don Bottstein

1 Answers

0
votes

@Don Bottstein Yes, if I send a POST-Request via curl:

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

then curl returns:

*   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
<

EDIT: SOLUTION

I figured out, that it's necessary to manually convert the JSON Input-String to an object via ObjectMapper class. (I thought the @Consumes Interface do that in background...)

Now it works:

@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);
}
}