Restful Services:发送HTTP 405而不是HTTP 500错误

时间:2014-07-30 15:00:34

标签: java jax-rs

有两个问题:
问题1:
当用户没有为其中一个POST api调用发送任何请求有效负载时。其对应的RestController方法处理传入的请求并抛出空指针异常。它将HTTP 500错误代码和堆栈跟踪作为错误描述发回。
HTTP 405应该返回此处。

@POST
@Path("/create")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response createEntity(MyEntity entity) 
{
 EntityRequest req = new EntityRequest();
 req.setName(entity.getName());//throws NPE here
 //few more lines to send req to backend and get the response back
 return response;
}


问题2:
GET请求API实现。

@GET
@Path("/entity/{entityId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON})
public Response findMyEntityById(
        @PathParam("entityId") String id) 
{
  EntityRequest req = new EntityRequest();
  //similar stuff and sends the response back
  return response;
}

问题是,如果用户点击http://localhost:8080/entities/entity/12并发送POST请求而不是GET。 API应该抛出405但它现在正在抛出500。 实际堆栈跟踪:
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException and MIME media type application/octet-stream was not found

1 个答案:

答案 0 :(得分:2)

第一个案例很清楚。 405表示"方法不允许"。如果特定URL无法回复当前方法的请求,则通常由容器或框架抛出。但是你确实使用了正确的方法,但是在你的代码中使用了导致NPE的空体。在这种情况下,预计会有500状态。

问题2尚不清楚。你应该发送更多细节。您要么不发送POST,要么URL可以接受POST。请仔细检查并发送有关您的配置,一些代码段等的详细信息。

编辑:

发布一些代码后我可以说GET请求不能消耗任何东西。从findMyEntityById()删除@Consumes({MediaType.APPLICATION_JSON})。试试吧。如果它有帮助你可以说它是Jersey中的一种错误:它实际上应该在部署期间抛出异常,GET不能消耗任何东西,或者如果@Consume方法被处理则忽略GET