这是我正在尝试做的事情,似乎我对RESTEasy文档遗漏了一些内容,所以请提前感谢您的帮助。
我的团队决定始终将200(ok)状态返回到我们的REST公开服务(排他性JSON)。所以,为此,我们决定依赖RESTEasy框架提供的Exception Mapper机制。
这意味着对于我们代码中的给定(业务或技术)问题,我们会引发Special RuntimeException,然后mapper必须构建一个ErrorBean作为响应主体。
这是代码中最重要的部分。
提出特殊例外的资源方法:
@GET
@Produces({ MediaType.APPLICATION_JSON })
@BadgerFish
@ApiOperation(value = "gets all documents of the current user", notes = "gets all documents of the current user", responseClass = "com.cdc.pcp.api.bean.DocumentVO", multiValueResponse=true)
public Response getAllDocuments() throws PCPResourceException {
try {
UserInformation userInformation = userService.getUserInformation(getUsername());
List<ParapheurNodeInformation> nodesInformations = new ArrayList<ParapheurNodeInformation>();
nodesInformations = taskService.getTasksReadyToSignOrValidate(userInformation);
int i = 0/0;
return Response.ok(BeanConverter.toDocumentVOList(nodesInformations)).build();
} catch (Exception e) {
LOG.error("Erreur lors de la récupération de la liste des documents pour l'utilisateur : " + getUsername() , e);
throw new PCPResourceException(e.getMessage(), "Erreur lors de la récupération de la liste des documents pour l'utilisateur", ResourceErrorCode.INTERNAL_ERROR, e);
}
}
特殊例外映射器:
@Provider
public class PCPResourceExceptionMapper implements ExceptionMapper<PCPResourceException> {
@Override
public Response toResponse(PCPResourceException exception) {
ErrorBean eb =new ErrorBean();
eb.setDeveloperMessage("lol");
eb.setErrorCode(0);
eb.setGeneration(new Date());
eb.setGravity(Gravity.ERROR);
eb.setMoreInfoUrl("lolll");
eb.setUserFriendlyMessage("fuck");
GenericEntity<ErrorBean> e = new GenericEntity<ErrorBean>(eb) {
};
return Response.ok(e).build();
}
}
日志
org.jboss.resteasy.spi.UnhandledException: org.jboss.resteasy.spi.WriterException: java.lang.NullPointerException
org.jboss.resteasy.core.SynchronousDispatcher.writeFailure(SynchronousDispatcher.java:460)
org.jboss.resteasy.core.SynchronousDispatcher.executeExceptionMapper(SynchronousDispatcher.java:349)
org.jboss.resteasy.core.SynchronousDispatcher.unwrapException(SynchronousDispatcher.java:373)
org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:362)
org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:233)
org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:209)
org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:557)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:524)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:126)
org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
com.cdc.pcp.api.util.ApiOriginFilter.doFilter(ApiOriginFilter.java:32)
答案 0 :(得分:0)
这不是一个答案,但它是一个开始。当我看一下这一行:
org.jboss.resteasy.core.SynchronousDispatcher.writeFailure(SynchronousDispatcher.java:460)
在这里:SynchronousDispatcher,我可以假设那时只能为空的东西是:ResteasyProviderFactory
。
我猜你错过了一些依赖关系,或者没有注册这个提供商工厂。
ExceptionMappers的注册方式与MessageBodyReaders和MessageBodyWriters相同:扫描RESTEasy提供程序context-param(如果要部署在WAR文件中),或者通过ResteasyProviderFactory类进行编程。 来自:
答案 1 :(得分:0)
我更改了Mapper代码,首先设置Status,然后将Error Bean放在响应的标题中:
return Response.status(Status.OK).header(HEADER_RESPONSE_PARAPHEUR_ERROR, gson.toJson(errorBean)).build();