You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2017/10/28 12:52:48 UTC
[cxf] branch master updated: CXF-7501: Cannot inject field in
ContainerRequestFilter (and generally,
into any providers registered using FeatureContext) (#329)
This is an automated email from the ASF dual-hosted git repository.
reta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new 336657c CXF-7501: Cannot inject field in ContainerRequestFilter (and generally, into any providers registered using FeatureContext) (#329)
336657c is described below
commit 336657c5ae672c7e0690f30f98a9e871f200aff9
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Sat Oct 28 08:52:45 2017 -0400
CXF-7501: Cannot inject field in ContainerRequestFilter (and generally, into any providers registered using FeatureContext) (#329)
* CXF-7501: Cannot inject field in ContainerRequestFilter (and generally, into any providers registered using FeatureContext)
* CXF-7501: Cannot inject field in ContainerRequestFilter (and generally, into any providers registered using FeatureContext). Added creational context disposal.
---
.../cxf/cdi/CdiServerConfigurableFactory.java | 91 ++++++++++++++++++++++
.../apache/cxf/cdi/JAXRSCdiResourceExtension.java | 28 ++++++-
.../cxf/cdi/event/DisposableCreationalContext.java | 21 ++---
.../apache/cxf/jaxrs/impl/ConfigurableImpl.java | 20 +++--
.../jaxrs/provider/ServerConfigurableFactory.java | 29 ++++---
.../cxf/jaxrs/provider/ServerProviderFactory.java | 18 ++---
.../systests/cdi/base/BookStoreAuthenticator.java} | 22 +++---
.../systests/cdi/base/BookStoreRequestFilter.java} | 22 ++++--
.../cxf/systest/jaxrs/cdi/SampleFeature.java | 2 +
.../cxf/systest/jaxrs/cdi/SampleFeature.java | 2 +
10 files changed, 196 insertions(+), 59 deletions(-)
diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiServerConfigurableFactory.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiServerConfigurableFactory.java
new file mode 100644
index 0000000..15d4643
--- /dev/null
+++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/CdiServerConfigurableFactory.java
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.cdi;
+
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanAttributes;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.InjectionTargetFactory;
+import javax.ws.rs.RuntimeType;
+import javax.ws.rs.core.Configurable;
+import javax.ws.rs.core.FeatureContext;
+
+import org.apache.cxf.cdi.event.DisposableCreationalContext;
+import org.apache.cxf.jaxrs.impl.ConfigurableImpl;
+import org.apache.cxf.jaxrs.impl.ConfigurableImpl.Instantiator;
+import org.apache.cxf.jaxrs.provider.ServerConfigurableFactory;
+
+/**
+ * Creates the instance of Configurable<?> suitable for CDI-managed runtime.
+ */
+public class CdiServerConfigurableFactory implements ServerConfigurableFactory {
+ private final BeanManager beanManager;
+
+ CdiServerConfigurableFactory(final BeanManager beanManager) {
+ this.beanManager = beanManager;
+ }
+
+ @Override
+ public Configurable<FeatureContext> create(FeatureContext context) {
+ return new CdiServerFeatureContextConfigurable(context, beanManager);
+ }
+
+ /**
+ * Instantiates the instance of the provider using CDI/BeanManager
+ */
+ private static class CdiInstantiator implements Instantiator {
+ private final BeanManager beanManager;
+
+ CdiInstantiator(final BeanManager beanManager) {
+ this.beanManager = beanManager;
+ }
+
+ @Override
+ public <T> Object create(Class<T> cls) {
+ final AnnotatedType<T> annotatedType = beanManager.createAnnotatedType(cls);
+ final InjectionTargetFactory<T> injectionTargetFactory =
+ beanManager.getInjectionTargetFactory(annotatedType);
+ final BeanAttributes<T> attributes = beanManager.createBeanAttributes(annotatedType);
+ final Bean<T> bean = beanManager.createBean(attributes, cls, injectionTargetFactory);
+ final CreationalContext<?> context = beanManager.createCreationalContext(bean);
+
+ if (!beanManager.isNormalScope(bean.getScope())) {
+ beanManager.fireEvent(new DisposableCreationalContext(context));
+ }
+
+ return beanManager.getReference(bean, cls, context);
+ }
+ }
+
+ private static class CdiServerFeatureContextConfigurable extends ConfigurableImpl<FeatureContext> {
+ private final Instantiator instantiator;
+
+ CdiServerFeatureContextConfigurable(FeatureContext mc, BeanManager beanManager) {
+ super(mc, RuntimeType.SERVER, SERVER_FILTER_INTERCEPTOR_CLASSES);
+ this.instantiator = new CdiInstantiator(beanManager);
+ }
+
+ @Override
+ protected Instantiator getInstantiator() {
+ return instantiator;
+ }
+ }
+}
diff --git a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
index 2a36a3a..ce23e1a 100644
--- a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
+++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
@@ -49,9 +49,11 @@ import javax.ws.rs.ext.Provider;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.extension.ExtensionManagerBus;
+import org.apache.cxf.cdi.event.DisposableCreationalContext;
import org.apache.cxf.cdi.extension.JAXRSServerFactoryCustomizationExtension;
import org.apache.cxf.feature.Feature;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.provider.ServerConfigurableFactory;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
/**
@@ -138,6 +140,11 @@ public class JAXRSCdiResourceExtension implements Extension {
busBean,
Bus.class,
beanManager.createCreationalContext(busBean));
+
+ // Adding the extension for dynamic providers registration and instantiation
+ if (bus.getExtension(ServerConfigurableFactory.class) == null) {
+ bus.setExtension(new CdiServerConfigurableFactory(beanManager), ServerConfigurableFactory.class);
+ }
for (final Bean< ? > application: applicationBeans) {
final Application instance = (Application)beanManager.getReference(
@@ -182,11 +189,22 @@ public class JAXRSCdiResourceExtension implements Extension {
}
/**
+ * Registers created CreationalContext instances for disposal
+ */
+ public void registerCreationalContextForDisposal(@Observes final DisposableCreationalContext event) {
+ synchronized (disposableCreationalContexts) {
+ disposableCreationalContexts.add(event.getContext());
+ }
+ }
+
+ /**
* Releases created CreationalContext instances
*/
public void release(@Observes final BeforeShutdown event) {
- for (final CreationalContext<?> disposableCreationalContext: disposableCreationalContexts) {
- disposableCreationalContext.release();
+ synchronized (disposableCreationalContexts) {
+ for (final CreationalContext<?> disposableCreationalContext: disposableCreationalContexts) {
+ disposableCreationalContext.release();
+ }
}
}
@@ -375,9 +393,13 @@ public class JAXRSCdiResourceExtension implements Extension {
*/
private<T> CreationalContext< T > createCreationalContext(final BeanManager beanManager, Bean< T > bean) {
final CreationalContext< T > creationalContext = beanManager.createCreationalContext(bean);
+
if (!(bean instanceof DefaultApplicationBean)) {
- disposableCreationalContexts.add(creationalContext);
+ synchronized (disposableCreationalContexts) {
+ disposableCreationalContexts.add(creationalContext);
+ }
}
+
return creationalContext;
}
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/integration/cdi/src/main/java/org/apache/cxf/cdi/event/DisposableCreationalContext.java
similarity index 68%
copy from systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
copy to integration/cdi/src/main/java/org/apache/cxf/cdi/event/DisposableCreationalContext.java
index 6a108dc..0944e4a 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/integration/cdi/src/main/java/org/apache/cxf/cdi/event/DisposableCreationalContext.java
@@ -17,17 +17,18 @@
* under the License.
*/
-package org.apache.cxf.systest.jaxrs.cdi;
+package org.apache.cxf.cdi.event;
-import javax.ws.rs.core.Feature;
-import javax.ws.rs.core.FeatureContext;
+import javax.enterprise.context.spi.CreationalContext;
-import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
-
-public class SampleFeature implements Feature {
- @Override
- public boolean configure(FeatureContext context) {
- context.register(AtomFeedProvider.class);
- return false;
+public class DisposableCreationalContext {
+ private final CreationalContext<?> context;
+
+ public DisposableCreationalContext(CreationalContext<?> context) {
+ this.context = context;
+ }
+
+ public CreationalContext<?> getContext() {
+ return context;
}
}
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java
index 9be144d..5454027 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurableImpl.java
@@ -31,12 +31,17 @@ import org.apache.cxf.jaxrs.utils.AnnotationUtils;
public class ConfigurableImpl<C extends Configurable<C>> implements Configurable<C> {
private ConfigurationImpl config;
- private C configurable;
- private Class<?>[] supportedProviderClasses;
+ private final C configurable;
+ private final Class<?>[] supportedProviderClasses;
+
+ public interface Instantiator {
+ <T> Object create(Class<T> cls);
+ }
+
public ConfigurableImpl(C configurable, RuntimeType rt, Class<?>[] supportedProviderClasses) {
this(configurable, supportedProviderClasses, new ConfigurationImpl(rt));
}
-
+
public ConfigurableImpl(C configurable, Class<?>[] supportedProviderClasses, Configuration config) {
this(configurable, supportedProviderClasses);
this.config = config instanceof ConfigurationImpl
@@ -98,8 +103,7 @@ public class ConfigurableImpl<C extends Configurable<C>> implements Configurable
@Override
public C register(Class<?> providerClass, int bindingPriority) {
- return doRegister(ConfigurationImpl.createProvider(providerClass),
- bindingPriority, supportedProviderClasses);
+ return doRegister(getInstantiator().create(providerClass), bindingPriority, supportedProviderClasses);
}
@Override
@@ -109,7 +113,11 @@ public class ConfigurableImpl<C extends Configurable<C>> implements Configurable
@Override
public C register(Class<?> providerClass, Map<Class<?>, Integer> contracts) {
- return register(ConfigurationImpl.createProvider(providerClass), contracts);
+ return register(getInstantiator().create(providerClass), contracts);
+ }
+
+ protected Instantiator getInstantiator() {
+ return ConfigurationImpl::createProvider;
}
private C doRegister(Object provider, int bindingPriority, Class<?>... contracts) {
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerConfigurableFactory.java
similarity index 53%
copy from systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
copy to rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerConfigurableFactory.java
index 6a108dc..f4e9ef8 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerConfigurableFactory.java
@@ -17,17 +17,26 @@
* under the License.
*/
-package org.apache.cxf.systest.jaxrs.cdi;
+package org.apache.cxf.jaxrs.provider;
-import javax.ws.rs.core.Feature;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.Configurable;
import javax.ws.rs.core.FeatureContext;
+import javax.ws.rs.ext.ReaderInterceptor;
+import javax.ws.rs.ext.WriterInterceptor;
-import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
-
-public class SampleFeature implements Feature {
- @Override
- public boolean configure(FeatureContext context) {
- context.register(AtomFeedProvider.class);
- return false;
- }
+/**
+ * Manages the creation of server-side Configurable<FeatureContext> depending on
+ * the presence of managed runtime (like CDI f.e.).
+ */
+public interface ServerConfigurableFactory {
+ Class<?>[] SERVER_FILTER_INTERCEPTOR_CLASSES = new Class<?>[] {
+ ContainerRequestFilter.class,
+ ContainerResponseFilter.class,
+ ReaderInterceptor.class,
+ WriterInterceptor.class
+ };
+
+ Configurable<FeatureContext> create(FeatureContext context);
}
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
index dbacd48..dda7ee2 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
@@ -21,11 +21,9 @@ package org.apache.cxf.jaxrs.provider;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
@@ -40,6 +38,7 @@ import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.PreMatching;
+import javax.ws.rs.core.Configurable;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
@@ -72,12 +71,6 @@ import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
public final class ServerProviderFactory extends ProviderFactory {
- private static final Set<Class<?>> SERVER_FILTER_INTERCEPTOR_CLASSES =
- new HashSet<Class<?>>(Arrays.<Class<?>>asList(ContainerRequestFilter.class,
- ContainerResponseFilter.class,
- ReaderInterceptor.class,
- WriterInterceptor.class));
-
private static final String WADL_PROVIDER_NAME = "org.apache.cxf.jaxrs.model.wadl.WadlGenerator";
private static final String MAKE_DEFAULT_WAE_LEAST_SPECIFIC = "default.wae.mapper.least.specific";
private List<ProviderInfo<ExceptionMapper<?>>> exceptionMappers =
@@ -399,8 +392,11 @@ public final class ServerProviderFactory extends ProviderFactory {
}
private FeatureContext createServerFeatureContext() {
- FeatureContextImpl featureContext = new FeatureContextImpl();
- ServerFeatureContextConfigurable configImpl = new ServerFeatureContextConfigurable(featureContext);
+ final FeatureContextImpl featureContext = new FeatureContextImpl();
+ final ServerConfigurableFactory factory = getBus().getExtension(ServerConfigurableFactory.class);
+ final Configurable<FeatureContext> configImpl = (factory == null)
+ ? new ServerFeatureContextConfigurable(featureContext)
+ : factory.create(featureContext);
featureContext.setConfigurable(configImpl);
if (application != null) {
@@ -418,7 +414,7 @@ public final class ServerProviderFactory extends ProviderFactory {
private static class ServerFeatureContextConfigurable extends ConfigurableImpl<FeatureContext> {
protected ServerFeatureContextConfigurable(FeatureContext mc) {
- super(mc, RuntimeType.SERVER, SERVER_FILTER_INTERCEPTOR_CLASSES.toArray(new Class<?>[]{}));
+ super(mc, RuntimeType.SERVER, ServerConfigurableFactory.SERVER_FILTER_INTERCEPTOR_CLASSES);
}
}
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreAuthenticator.java
similarity index 68%
copy from systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
copy to systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreAuthenticator.java
index 6a108dc..d2448ce 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreAuthenticator.java
@@ -16,18 +16,18 @@
* specific language governing permissions and limitations
* under the License.
*/
+package org.apache.cxf.systests.cdi.base;
-package org.apache.cxf.systest.jaxrs.cdi;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Named;
-import javax.ws.rs.core.Feature;
-import javax.ws.rs.core.FeatureContext;
-
-import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
-
-public class SampleFeature implements Feature {
- @Override
- public boolean configure(FeatureContext context) {
- context.register(AtomFeedProvider.class);
- return false;
+@Named @ApplicationScoped
+public class BookStoreAuthenticator {
+ public BookStoreAuthenticator() {
+
+ }
+
+ public boolean authenticated() {
+ return true;
}
}
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreRequestFilter.java
similarity index 56%
copy from systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
copy to systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreRequestFilter.java
index 6a108dc..cbd8811 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/base/src/main/java/org/apache/cxf/systests/cdi/base/BookStoreRequestFilter.java
@@ -17,17 +17,23 @@
* under the License.
*/
-package org.apache.cxf.systest.jaxrs.cdi;
+package org.apache.cxf.systests.cdi.base;
-import javax.ws.rs.core.Feature;
-import javax.ws.rs.core.FeatureContext;
+import java.io.IOException;
-import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
+import javax.inject.Inject;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
-public class SampleFeature implements Feature {
+public class BookStoreRequestFilter implements ContainerRequestFilter {
+ @Inject private BookStoreAuthenticator authenticator;
+
@Override
- public boolean configure(FeatureContext context) {
- context.register(AtomFeedProvider.class);
- return false;
+ public void filter(ContainerRequestContext requestContext) throws IOException {
+ if (!authenticator.authenticated()) {
+ requestContext.abortWith(Response.status(Status.UNAUTHORIZED).build());
+ }
}
}
diff --git a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
index 6a108dc..ba34082 100644
--- a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
@@ -23,11 +23,13 @@ import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
+import org.apache.cxf.systests.cdi.base.BookStoreRequestFilter;
public class SampleFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(AtomFeedProvider.class);
+ context.register(BookStoreRequestFilter.class);
return false;
}
}
diff --git a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
index 6a108dc..ba34082 100644
--- a/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
+++ b/systests/cdi/cdi-weld/cdi-producers-weld/src/test/java/org/apache/cxf/systest/jaxrs/cdi/SampleFeature.java
@@ -23,11 +23,13 @@ import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import org.apache.cxf.jaxrs.provider.atom.AtomFeedProvider;
+import org.apache.cxf.systests.cdi.base.BookStoreRequestFilter;
public class SampleFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(AtomFeedProvider.class);
+ context.register(BookStoreRequestFilter.class);
return false;
}
}
--
To stop receiving notification emails like this one, please contact
['"commits@cxf.apache.org" <co...@cxf.apache.org>'].