发送404而不是405,这是空的WebApplicationException

时间:2014-10-09 09:05:57

标签: java rest http dropwizard

我有dropwizard.io应用程序,并且GET请求有问题,我的资源看起来像:

@Path("/foobar")
public class FooBarResource
  (...)
  @GET
  @Path("/{id}")
  @UnitOfWork
  public Response getFooBar( @PathParam("id") Long id){
    return Response.status(200).entity(FooBarService.get(id)).build();
  }

  @DELETE
  @Path("/{id}")
  @UnitOfWork
  public Response getFooBar( @PathParam("id") Long id){
    return Response.status(200).entity(FooBarService.delete(id)).build();
  }

  @PUT
  @Path("/{id}")
  @UnitOfWork
  public Response getFooBar( @PathParam("id") Long id, FooBar fooBar){
    return Response.status(204).entity(FooBarService.update(id, fooBar)).build();
  }
}

当我发送GET localhost:port/appPath/foobar/时,我有405而不是404.我怎么能得到404?当我调试我的应用时,我所拥有的只是javax.ws.rs.WebApplicationException,但它是空的。

2 个答案:

答案 0 :(得分:1)

您尝试GET localhost:port / appPath / foobar /并获得405(不允许使用方法)。原因是此资源(= foobar)存在,因此404(未找到资源)是错误的。如果您创建getFooBar()的副本 - >没有路径通知的getFooBar2()你应该得到200。

如果需要,可以创建一个容器过滤器,如果找不到路径,则会产生异常。然后可以将此异常映射到404。

答案 1 :(得分:0)

您应该使用可选的路径参数,如here

所述
@GET
@Path("/{id:.*}")
@UnitOfWork
public Response getFooBar( @PathParam("id") String id){
    try {
        return Response.status(200).entity(FooBarService.get(Long.parseLong(id))).build();
    } catch (NumberFormatException ignore) {
        return Response.status(404).build();
    }
}