Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAX-RS服务抛出404 HTTPException,但客户端接收HTTP 500代码_Java_Jax Rs - Fatal编程技术网

Java JAX-RS服务抛出404 HTTPException,但客户端接收HTTP 500代码

Java 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

我有一个RESTful资源,它调用EJB进行查询。如果查询没有结果,EJB将抛出EntityNotFoundException。在catch块中,将抛出代码为404的javax.xml.ws.http.HTTPException

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