OK I have a pull request for this. I ended up with a separate proposed
implementation that was much easier to execute. Namely there is a new
annotation @InterceptsRemoteCall that references the interfaces that
should be intercepted. This annotation is applied to the interceptor
class itself. So something like this:
@InterceptsRemoteCall({ RemoteOne.class, RemoteTwo.class })
public class MyInterceptor implements RestClientInterceptor {
@Override
public void aroundInvoke(RestCallContext context) {
context.getRequestBuilder()
.setHeader("X-Custom-Header", "Custom Value");
context.proceed(); // must be called to continue chain
}
}
This solves the core problem of being able to intercept calls to remote
interfaces without modifying (annotating) those interfaces.
Pull request: https://github.com/errai/errai/pull/80
The PR does *not* include any Interceptor + IOC enhancements. I have a
proposal for that and will email it out separately.
-Eric
On 2/9/2014 7:03 PM, Christian Sadilek wrote:
> Yes, I think this is what it should look like. However, we have to make sure
> errai-bus and errai-jaxrs (both support client-side interceptors) can be used
> without errai-ioc. We have people in the community using these modules with
> alternative IOC providers (GIN).
>
> This is something we have to consider when implementing this especially in
> regards to interceptor instances being managed beans. We now have a way to
> determine (at rebind time) whether or not errai-ioc was inherited. So, we
> could generate different code if that's the case.
>
> Cheers,
> Christian
>
> On 2014-02-07, at 3:11 PM, Eric Wittmann <[email protected]> wrote:
>
>> I think I'm a fan of option #2. To be clear, would it look like this (for
>> example)?
>>
>> @Templated
>> @Page(path="dashboard", role=DefaultPage.class)
>> @Dependent
>> public class DashboardPage extends AbstractPage {
>>
>> @Inject
>> @Interceptors({ AuthInterceptor.class, ReqHeaderInterceptor.class })
>> private Caller<IMyRestService> caller;
>>
>> }
>>
>> That seems pretty slick to me. It does mean that if I inject that Caller in
>> multiple places I need to specify the interceptor list each time. But that
>> actually sounds pretty powerful to me.
>>
>> Would the interceptors be managed beans (i.e. injected into the Caller)? My
>> use case would be that I'd have an AuthenticationInterceptor for my Caller,
>> but I would want to @Inject a configuration bean of some kind into it,
>> because I might be using either BASIC auth *or* Bearer Token auth, and the
>> managed configuration bean is what knows which it is.
>>
>> -Eric
>>
>> PS: adding the errai-dev list to the conversation, which is what I should
>> have done originally
>>
>> On 2/7/2014 11:35 AM, Christian Sadilek wrote:
>>> Yeah, I had thought about that as well before but couldn't decide what's
>>> best:
>>>
>>> - Add a mapping to ErraiApp.properties
>>> - Add an annotation/qualifier @Interceptors(...) that can be used when
>>> injecting a Caller<?>
>>> - Add a parameter to call() that takes a List of interceptors
>>>
>>> Definitely a good feature to have. Wdyt?
>>>
>>> Cheers,
>>> Christian
>>>
>>> On 2014-02-07, at 10:06 AM, Eric Wittmann <[email protected]> wrote:
>>>
>>>> I was reading the documentation re: client interceptors for jax-rs in
>>>> Errai and I was wondering what you thought about adding a mechanism to
>>>> allow client interceptors to be defined either globally or in some way
>>>> that doesn't require modifying the JAX-RS interface (to add annotations).
>>>> I'm thinking that in some cases a developer might be creating a UI and
>>>> invoking REST services where they have access to the jax-rs interfaces but
>>>> do not have write privs. In other words they can consume them but not
>>>> modify them. In that case it might be nice to able to apply interceptors
>>>> in some other way.
>>>>
>>>> Thoughts?
>>>>
>>>> -Eric
>>>
>
_______________________________________________
errai-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/errai-dev