Cannot set the request filter to my JaxRsApplication [message #1703085] |
Tue, 28 July 2015 14:00 |
|
I have my own jaxrs application which extend JaxRsApplication, and I try to add customized container request filter, but It cannot work. Could you please help me to find out my mistake?
package com.octech.mamalianmeng.httpservice.application.base;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Application;
import org.eclipse.gyrex.context.IRuntimeContext;
import org.eclipse.gyrex.http.jaxrs.JaxRsApplication;
import com.sun.jersey.api.core.DefaultResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.spi.container.ContainerRequestFilter;
import com.sun.jersey.spi.container.ContainerResponseFilter;
public abstract class AbstractMumUnionJaxRsApplication extends JaxRsApplication {
public AbstractMumUnionJaxRsApplication(String id, IRuntimeContext context) {
super(id, context);
}
protected Application createJaxRsApplication() {
Application application = super.createJaxRsApplication();
if (application.getClass().getName().equals(DefaultResourceConfig.class.getName())) {
DefaultResourceConfig defaultResourceConfig = (DefaultResourceConfig) application;
this.setContainerRequestFilters(defaultResourceConfig);
this.setContainerResponseFilters(defaultResourceConfig);
return defaultResourceConfig;
} else {
return application;
}
}
/**
* 设置请求过滤器
* @param defaultResourceConfig
*/
private final void setContainerRequestFilters(DefaultResourceConfig defaultResourceConfig) {
if (defaultResourceConfig == null) {
return;
}
List<Class<?>> containerFilters = this.getContainerRequestFilters();
if (containerFilters != null && containerFilters.size() > 0) {
List<String> filters = new ArrayList<String>();
if (defaultResourceConfig.getProperties().containsKey(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS)) {
filters.add((String) defaultResourceConfig.getProperty(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS));
}
for (int i = 0; i < containerFilters.size(); i++) {
if (ContainerRequestFilter.class.isAssignableFrom(containerFilters.get(i))) {
filters.add(containerFilters.get(i).getName());
}
}
defaultResourceConfig.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS, filters.toArray());
}
}
/**
* 设置相应过滤器
* @param defaultResourceConfig
*/
private final void setContainerResponseFilters(DefaultResourceConfig defaultResourceConfig) {
if (defaultResourceConfig == null) {
return ;
}
List<Class<?>> containerFilters = this.getContainerResponseFilters();
if (containerFilters != null && containerFilters.size() > 0) {
List<String> filters = new ArrayList<String>();
if (defaultResourceConfig.getProperties().containsKey(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS)) {
filters.add((String) defaultResourceConfig.getProperty(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS));
}
for(int i = 0; i < containerFilters.size(); i++) {
if (ContainerResponseFilter.class.isAssignableFrom(containerFilters.get(i))) {
filters.add(containerFilters.get(i).getName());
}
}
defaultResourceConfig.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS, filters.toArray());
}
}
/**
* 返回请求过滤器的类数组,filter的执行顺序以加入list中的顺序为准
* @return
*/
protected abstract List<Class<?>> getContainerRequestFilters();
/**
* 返回相应过滤器的类数组,filter的执行顺序以加入list中的顺序为准
* @return
*/
protected abstract List<Class<?>> getContainerResponseFilters();
}
package com.octech.mamalianmeng.httpservice.application;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.gyrex.context.IRuntimeContext;
import com.octech.mamalianmeng.httpservice.application.base.AbstractMumUnionJaxRsApplication;
import com.octech.mamalianmeng.httpservice.application.filter.AuthorizationFilter;
import com.octech.mamalianmeng.httpservice.resource.OrderServiceResource;
public class DefaultMumUnionJaxRsApplication extends AbstractMumUnionJaxRsApplication {
public DefaultMumUnionJaxRsApplication(String id, IRuntimeContext context) {
super(id, context);
}
@Override
protected List<Class<?>> getContainerRequestFilters() {
List<Class<?>> filters = new ArrayList<Class<?>>();
filters.add(AuthorizationFilter.class);
return filters;
}
@Override
protected List<Class<?>> getContainerResponseFilters() {
return Collections.emptyList();
}
@Override
protected Set<Class<?>> getJaxRsClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(OrderServiceResource.class);
return classes;
}
}
Study every day, and love every day!
|
|
|
|
Re: Cannot set the request filter to my JaxRsApplication [message #1703101 is a reply to message #1703085] |
Tue, 28 July 2015 14:27 |
|
On 2015-07-28 14:00:26 +0000, Sean Zhang said:
> I have my own jaxrs application which extend JaxRsApplication, and I
> try to add customized container request filter, but It cannot work.
> Could you please help me to find out my mistake?
I wonder if you could simply provide them as @Provider annotated
classes and use the bundle scanning feature. Is that possible with
filters?
-Gunnar
--
Gunnar Wagenknecht
gunnar@xxxxxxxx
|
|
|
Re: Cannot set the request filter to my JaxRsApplication [message #1703309 is a reply to message #1703087] |
Thu, 30 July 2015 13:29 |
Tomas Tamošaitis Messages: 2 Registered: October 2012 |
Junior Member |
|
|
Hi,
I had the same issue.
My soltion was
public class JaxRsAppExt extends JaxRsApplication {
private ContextServiceInjectableProvider contextServiceInjector;
private InjectServiceInjectableProvider injectServiceInjector;
private final Bundle bundle;
public JaxRsAppExt(final String id, final IRuntimeContext context, final Bundle bundle) {
super(id, context);
this.bundle = bundle;
}
@SuppressWarnings("unchecked")
@Override
protected Application createJaxRsApplication() {
final Application app = super.createJaxRsApplication();
if (null != this.contextServiceInjector) {
app.getSingletons().add(this.contextServiceInjector);
}
if (null != this.injectServiceInjector) {
app.getSingletons().add(this.injectServiceInjector);
}
((ResourceConfig) app).getContainerRequestFilters().add(0, APIAuthFilter.class);
((ResourceConfig) app).getContainerResponseFilters().add(0, APIAuthFilter.class);
((ResourceConfig) app).getResourceFilterFactories().add(0, RolesAllowedResourceFilterFactory.class);
return app;
}
@Override
protected void doDestroy() {
try {
// call super
super.doDestroy();
} finally {
if (null != this.contextServiceInjector) {
this.contextServiceInjector.dispose();
this.contextServiceInjector = null;
}
if (null != this.injectServiceInjector) {
this.injectServiceInjector.dispose();
this.injectServiceInjector = null;
}
}
}
@Override
protected void doInit() throws IllegalStateException, Exception {
// create service injector
this.contextServiceInjector = new ContextServiceInjectableProvider(this.bundle.getBundleContext());
this.injectServiceInjector = new InjectServiceInjectableProvider(this.bundle.getBundleContext());
// call super
super.doInit();
}
@Override
protected Set<Class<?>> getJaxRsClasses() {
return new BundleScanningResourceConfig(this.bundle).getClasses();
}
}
Then you adding over porperties ir
[Updated on: Thu, 30 July 2015 13:31] Report message to a moderator
|
|
|
Powered by
FUDForum. Page generated in 0.03837 seconds