cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Lambert, Michael" <mich...@michaellambert.com>
Subject Re: jax-rs exception mapping
Date Tue, 21 Oct 2014 19:04:40 GMT
To be clear:

This bug will only manifest itself if two exception mapper are both derived
from the same interface:

    public class AbstractMapper<T extends Throwable> implements
ExceptionMapper<T> {
        ...
    }

    public class FooMapper extends AbstractMapper<FooException> {
        ...
    }

    // ProviderFactory.ClassComparator.compare will return "0" when
BarMapper is compared to FooMapper
    public class BarMapper extends AbstractMapper<BarException> {
        ...
    }

If each exception mapper instance is derived from a DIFFERENT INTERFACE
everything works fine:

    public interface IFooMapper extends ExceptionMapper<FooException> {
        ...
    }

    public class FooMapper extends implements IFooMapper  {
        ...
    }

    public interface IBarMapper extends ExceptionMapper<BarException> {
        ...
    }

    // ProviderFactory.ClassComparator.compare will return "1" or -1 when
BarMapper is compared to FooMapper
    public class BarMapper extends implements IBarMapper {
        ...
    }



On Tue, Oct 21, 2014 at 2:34 PM, Lambert, Michael <
michael@michaellambert.com> wrote:

> Guys... it looks like there is a bug in ProviderFactory$ClassComparator.
> Given two mappers it always ends up comparing them as if both mappers were
> ExceptionMapper<Throwable>. There must be a problem in the way the
> interfaces and "actual types" are derived (which is done in the
> InjectionUtils class).
>
> -Mike
>
> On Tue, Oct 21, 2014 at 1:24 PM, Lambert, Michael <
> michael@michaellambert.com> wrote:
>
>> Hello gentleman!
>>
>> My impression was that when implementing ExceptionMapper that the mapper
>> of the nearest superclass of an exception would be used if an exact
>> exceptionmapper match to the exception didnt exist.
>>
>> For example if I created a FooException which extended BarException  I
>> would only have to create a BarExceptionMapper to catch and map both types
>> of exceptions; the BarExceptionMapper would be used when a FooException was
>> thrown.
>>
>> The red hat docs seem to reinforce this opinion:
>>
>>
>>    -
>>
>>    When any exception other than a WebApplicationException exception, or
>>    one of its subclasses, is thrown, the runtime will check for an appropriate
>>    exception mapper. An exception mapper is selected if it handles the
>>    specific exception thrown. If there is not an exception mapper for the
>>    specific exception that was thrown, the exception mapper for the nearest
>>    superclass of the exception is selected.
>>
>>
>>
>> https://access.redhat.com/documentation/en-US/Red_Hat_JBoss_Fuse/6.1/html/Apache_CXF_Development_Guide/files/RESTExceptionMapper.html
>>
>> The reality is different for us however. In fact, if we create a custom
>> WebApplicationExceptionMapper ClientErrorExceptions are not caught by the
>> mapper. CXF seems to default to attempt to use whichever Mapper is the
>> first one we registered (e.g. if we defined a FooExceptionMapper and
>> registered it, CXF would attempt to use that and throw an error rather than
>> try to use the WebApplicationExceptionMapper).
>>
>> Can someone tell me what the expected behavior is? Is my question clear?
>>
>> We are using CXF version 2.7.11.
>>
>> Thanks!
>>
>> Mike
>>
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message