【发布时间】:2014-03-18 15:25:00
【问题描述】:
这是一个 JAX-RS 端点:
@Path("logout")
@POST
public void logout(@HeaderParam("X-AuthToken") String apiToken) {
try {
authenticationService.logout(apiToken);
} catch (ExpiredApiTokenException exc) {
throw new BadRequestException("API token has expired");
} catch (InvalidApiTokenException exc) {
throw new BadRequestException("API token is not valid");
} catch (ApplicationException exc) {
throw new InternalServerErrorException();
}
}
当其中一个BadRequestExceptions (HTTP 400) 被抛出时,GlassFish 在响应正文中返回它自己的错误页面,而不是在我的代码中返回错误消息。响应包含正确的 HTTP 代码。只是身体被替换了。
我已经尝试创建一个ExceptionMapper:
@Provider
public class ExceptionMapperImpl implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable exception) {
if (exception instanceof WebApplicationException) {
return ((WebApplicationException) exception).getResponse();
} else {
logger.log(Level.SEVERE, "Uncaught exception thrown by REST service", exception);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
}
private static final Logger logger = Logger.getLogger(ExceptionMapperImpl.class.getName());
}
我尝试添加以下 ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd">
<assembly-descriptor>
<application-exception>
<exception-class>javax.ws.rs.WebApplicationException</exception-class>
<rollback>true</rollback>
</application-exception>
</assembly-descriptor>
</ejb-jar>
一切都无济于事。
我错过了什么?
【问题讨论】:
-
您明确要求 WebApplicationException 的响应(因为 BadRequestException 是 WebApplicationException)。
-
您能详细说明一下吗?我在哪里做这个?我应该怎么做?仅供参考 - 我尝试了所有四种组合:带/不带提供程序和带/不带 ejb-jar.xml。四种情况下的行为相同。
-
在您的异常映射器中,您有
if (exception instanceof WebApplicationException),这对于 BadRequestException 是正确的,然后您从那里获得 WebApplicationException 的响应。我敢打赌你想做的是建立你自己的回应(可能通过明确检查BadRequestException)。 -
没有。我想要做的是得到一个响应,其正文只包含我传递给异常构造函数的消息字符串。仅供参考 - 似乎提供者被完全忽略了。
toResponse永远不会被调用。 -
ExceptionMapperImpl现在被调用(刚刚开始工作)。我将其更改为返回Response.ok().build()而不是((WebApplicationException) exception).getResponse()并且有效,但是当我将其更改回来时,GlassFish 仍然返回自己的页面,尽管异常映射器正在返回自己的响应。
标签: java jersey jax-rs glassfish-4