JAX-RS 异常映射器在 Grizzly 容器中不工作
JAX-RS Exception Mapper not working in Grizzly container
与团队一起开发 Jersey Web 应用程序,随着项目变得越来越大,我们决定从 Tomcat 切换到 Grizzly,以允许在不同的端口号上部署部分项目。我现在发现,我们的自定义异常处理现在无法正常工作,相反,我总是得到 grizzly html 页面。
异常示例:
public class DataNotFoundException extends RuntimeException{
private static final long serialVersionUID = -1622261264080480479L;
public DataNotFoundException(String message) {
super(message);
System.out.println("exception constructor called"); //this prints
}
}
映射器:
@Provider
public class DataNotFoundExceptionMapper implements ExceptionMapper<DataNotFoundException>{
public DataNotFoundExceptionMapper() {
System.out.println("mapper constructor called"); //doesnt print
}
@Override
public Response toResponse(DataNotFoundException ex) {
System.out.println("toResponse called"); //doesnt print
ErrorMessage errorMessage = new ErrorMessage(ex.getMessage(), 404, "No documentation yet.");
return Response.status(Status.NOT_FOUND)
.entity(errorMessage)
.build();
//ErrorMessage is a simple POJO with 2 string and 1 int field
}
}
我不确定问题的根源在哪里,如果需要我可以提供更多information/code。有什么问题,我可以尝试什么?
编辑:
Main.class:
public class Main {
/**
* Main method.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
...
List<ServerInfo> serverList = new ArrayList<ServerInfo>();
serverList.add(new ServerInfo(
"api",8450,
new ResourceConfig().registerClasses(
the.package.was.here.ApiResource.class)
));
for(ServerInfo server : serverList) {
server.start();
}
System.out.println("Press enter to exit...");
System.in.read();
for(ServerInfo server : serverList) {
server.stop();
}
}
}
编辑2:
基于 问题,我尝试使用此 ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true"
属性,但效果不大。当异常发生时,我仍然得到 html grizzly 页面,但现在我在页面正文中看到我的异常(+堆栈跟踪)。
您只为整个应用程序注册了一个资源class
new ResourceConfig().registerClasses(
eu.arrowhead.core.api.ApiResource.class
)
映射器也需要注册
new ResourceConfig().registerClasses(
eu.arrowhead.core.api.ApiResource.class,
YourMapper.class)
)
您还可以使用包扫描,如果它们被注释为 @Path
或 @Provider
,它将拾取所有 class 并自动注册它们
new ResourceConfig().packages("the.packages.to.scan")
与团队一起开发 Jersey Web 应用程序,随着项目变得越来越大,我们决定从 Tomcat 切换到 Grizzly,以允许在不同的端口号上部署部分项目。我现在发现,我们的自定义异常处理现在无法正常工作,相反,我总是得到 grizzly html 页面。
异常示例:
public class DataNotFoundException extends RuntimeException{
private static final long serialVersionUID = -1622261264080480479L;
public DataNotFoundException(String message) {
super(message);
System.out.println("exception constructor called"); //this prints
}
}
映射器:
@Provider
public class DataNotFoundExceptionMapper implements ExceptionMapper<DataNotFoundException>{
public DataNotFoundExceptionMapper() {
System.out.println("mapper constructor called"); //doesnt print
}
@Override
public Response toResponse(DataNotFoundException ex) {
System.out.println("toResponse called"); //doesnt print
ErrorMessage errorMessage = new ErrorMessage(ex.getMessage(), 404, "No documentation yet.");
return Response.status(Status.NOT_FOUND)
.entity(errorMessage)
.build();
//ErrorMessage is a simple POJO with 2 string and 1 int field
}
}
我不确定问题的根源在哪里,如果需要我可以提供更多information/code。有什么问题,我可以尝试什么?
编辑:
Main.class:
public class Main {
/**
* Main method.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
...
List<ServerInfo> serverList = new ArrayList<ServerInfo>();
serverList.add(new ServerInfo(
"api",8450,
new ResourceConfig().registerClasses(
the.package.was.here.ApiResource.class)
));
for(ServerInfo server : serverList) {
server.start();
}
System.out.println("Press enter to exit...");
System.in.read();
for(ServerInfo server : serverList) {
server.stop();
}
}
}
编辑2:
基于 ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true"
属性,但效果不大。当异常发生时,我仍然得到 html grizzly 页面,但现在我在页面正文中看到我的异常(+堆栈跟踪)。
您只为整个应用程序注册了一个资源class
new ResourceConfig().registerClasses(
eu.arrowhead.core.api.ApiResource.class
)
映射器也需要注册
new ResourceConfig().registerClasses(
eu.arrowhead.core.api.ApiResource.class,
YourMapper.class)
)
您还可以使用包扫描,如果它们被注释为 @Path
或 @Provider
new ResourceConfig().packages("the.packages.to.scan")