Context
We use a javax.ws.rs.ext.ExceptionMapper<Exception>
annotated as @javax.ws.rs.ext.Provider
to handle all exceptions. Internally this ExceptionMapper
is distinguishing between different types of exceptions to determine what information to reveal to the client.
In the case of the javax.validation.ConstraintViolationException
, we return additional information about which field was invalid and why.
Problem
We just switched from TomEE 1.7.2 JAX-RS
to TomEE 7.0.0-SNAPSHOT webprofile
.
With TomEE 1.7.2 JAX-RS
we used the openejb.jaxrs.providers.auto=true
system property, our ExceptionMapper
was automatically found and used.
With TomEE 7.0.0-SNAPSHOT webprofile
the property is no longer necessary to benefit from auto discovery.
However the org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
is also discovered and now acts as the preferred ExceptionMapper
for the javax.validation.ConstraintViolationException
. Our own ExceptionMapper
does not run, and the client therefore gets no information about what went wrong during validation.
Our own ExceptionMapper<Exception>
still handles all other exceptions.
What I already tried
"duplicate" the specialized ExceptionMapper
I placed my own javax.ws.rs.ext.ExceptionMapper<javax.validation.ConstraintViolationException>
next to my resources, hoping that it takes precedence over the CXF one.
Still the org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
takes precedence.
Update: it turned out that this indeed does the trick. I don't know why my initial test didn't work.
Disable the ValidationExceptionMapper
via system.properties
In the changelog of TomEE 7.0.0-SNAPSHOT
I noticed
TOMEE-1336 Support classname.activated = true/false for auto discovered providers
Looking at the corresponding changeset I was hopeful that I could just disable the org.apache.cxf.jaxrs.validation.ValidationExceptionMapper
by adding
org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated=false
to our system.properties
.
This remained without effect.
Questions
- Is this CXF or TomEE behaviour?
- How do we configure which
ExceptionMapper
takes precedence?