So I'm building a web application, we are using JPA and Jersey to consume/produces JSON data.
I have a custom "EntityException" aswell as a custom "EntityExceptionMapper"
Here's the mapper:
@Provider
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {
public EntityExceptionMapper() {
System.out.println("Mapper created");
}
@Override
public Response toResponse(EntityException e) {
System.out.println("This doesnt print!");
return Response.serverError().build();
}
}
My Exception:
public class EntityException extends Exception implements Serializable{
public EntityException(String message) {
super(message);
System.out.println("This prints...");
}
}
And I'm calling it from a REST call:
@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String test() throws EntityException{
throw new EntityException("This needs to be send as response!!");
//return "test";
}
My problem is that, when the above exception is thrown, I get in the constructor (prints: "This prints...") Edit: I also get the: "Mapper created!"
But my response is empty, and I don't get to the sys out of my toResponse method. This is really similar to the example on the jersey website:
https://jersey.java.net/nonav/documentation/1.12/jax-rs.html#d4e435
What am I missing??
I am still using jersey 1.17 , spring and jersy-spring
@Component annotation fixes this
I had the same problem and was able to fix it by including the package of my ExceptionMapper in the jersey.config.server.provider.packages in my web.xml file. Below is a snippet from my web.xml.
I had a similar problem where the
ExceptionMapper
had the proper@Provider
annotation and the rest of the code was identical to Jersey's example but still wasn't registered properly.Well it turns out I had to register manually my custom
ExceptionMapper
within myHttpServlet
with the methodaddExceptionMapper
. Because it's now manually registered, the@Provider
annotation can be safely removed.So with the following ExceptionMapper (I'm catching every
RuntimeException
to rethrow them as 400)I had to add the 2nd line in my init :
Try to register your exception mapper class in your X extends ResourceConfig file. register(CustomExceptionMapper.class); this line will help application to find your mapper class and return whatever you have written inside the toResponse method of mapper class