Java JAX-RS服务抛出404 HTTPException,但客户端接收HTTP 500代码
我有一个RESTful资源,它调用EJB进行查询。如果查询没有结果,EJB将抛出EntityNotFoundException。在catch块中,将抛出代码为404的javax.xml.ws.http.HTTPExceptionJava JAX-RS服务抛出404 HTTPException,但客户端接收HTTP 500代码,java,jax-rs,Java,Jax Rs,我有一个RESTful资源,它调用EJB进行查询。如果查询没有结果,EJB将抛出EntityNotFoundException。在catch块中,将抛出代码为404的javax.xml.ws.http.HTTPException @Stateless @Path("naturezas") public class NaturezasResource { @GET @Path("list/{code}") @Produces(MediaType.APPLICATION_J
@Stateless
@Path("naturezas")
public class NaturezasResource {
@GET
@Path("list/{code}")
@Produces(MediaType.APPLICATION_JSON)
public String listByLista(
@PathParam("code") codeListaNaturezasEnum code) {
try {
List<NaturezaORM> naturezas = this.naturezaSB
.listByListaNaturezas(code);
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(naturezas);
} catch (EntityNotFoundException e) { // No data found
logger.error("there is no Natures with the code " + code);
throw new HTTPException(404);
} catch (Exception e) { // Other exceptions
e.printStackTrace();
throw new HTTPException(500);
}
}
}
@无状态
@路径(“自然”)
公共类性质资源{
@得到
@路径(“列表/{code}”)
@产生(MediaType.APPLICATION_JSON)
公共字符串listByLista(
@PathParam(“代码”)codeListaNaturezasEnum(代码){
试一试{
列出naturezas=this.naturezaSB
.Listbylista(代码);
ObjectMapper mapper=新的ObjectMapper();
返回mapper.writeValueAsString(naturezas);
}catch(EntityNotFoundException e){//未找到任何数据
logger.error(“代码”+代码没有性质);
抛出新的HTTPException(404);
}捕获(异常e){//其他异常
e、 printStackTrace();
抛出新的HTTPException(500);
}
}
}
当我使用没有结果的代码调用Rest服务时,会打印EntityNotFoundException
catch块中的日志消息。然而,我的客户机收到的是HTTP代码500,而不是404。为什么我没有收到404代码
谢谢
Rafael Afonso是JAX-WS的代表。默认情况下,JAX-RS不知道如何处理它,除非您为它编写一个ExceptionMapper
。因此,异常冒泡到容器级别,它只发送一个通用的内部服务器错误响应
而是使用或其子类之一。这里是层次结构中包含的异常列表,以及它们映射到的对象(注意:这仅在JAX-RS2中)
您也可以在上面的WebApplicationException
链接中找到它们。它们将属于一个直接子类ClientErrorException
,RedirectionException
,或ServerErrorException
在JAX-RS1.x中,这种层次结构不存在,因此您需要执行类似于注释中显示的@RafaelAlfonso的操作
throw new WebApplicationException(Response.Status.NOT_FOUND);
还有很多其他可能的构造函数。只需查看上面的API链接抛出新的WebApplicationException(Response.status(404.build());对于JAX-RS 2,我倾向于使用
NotFoundException
,它是一个子类,并被映射到404:-)我确实抛出了新的WebApplicationException(e,Response.Status.NOT_FOUND)代码>
throw new WebApplicationException(Response.Status.NOT_FOUND);