DATACMNS-776 - Made ProxyingHandlerMethodArgumentResolver to only support user types or annotated ones.
ProxyingHandlerMethodArgumentResolver is now more lenient when it comes to which types to support for proxying. As indicated in the ticket, we've been to aggressive opting in for all interfaces which - depending on the order of converter registrations - caused us interfering with other interface based resolutions (e.g. in Spring Mobile, Security etc.). We now only aggressively kick in if either the type is not a Spring Framework or native Java one. This should leave user defined types still be accepted whereas the types we previously erroneously interfered with should now be ignored.
This commit is contained in:
@@ -15,6 +15,9 @@
|
||||
*/
|
||||
package org.springframework.data.web;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.MutablePropertyValues;
|
||||
import org.springframework.beans.factory.BeanClassLoaderAware;
|
||||
@@ -25,6 +28,7 @@ import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.core.io.ResourceLoader;
|
||||
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.web.bind.WebDataBinder;
|
||||
import org.springframework.web.bind.support.WebDataBinderFactory;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@@ -40,6 +44,8 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver;
|
||||
public class ProxyingHandlerMethodArgumentResolver extends ModelAttributeMethodProcessor
|
||||
implements BeanFactoryAware, ResourceLoaderAware, BeanClassLoaderAware {
|
||||
|
||||
private static final List<String> IGNORED_PACKAGES = Arrays.asList("java", "org.springframework");
|
||||
|
||||
private final SpelAwareProxyProjectionFactory proxyFactory;
|
||||
private final ConversionService conversionService;
|
||||
|
||||
@@ -90,7 +96,21 @@ public class ProxyingHandlerMethodArgumentResolver extends ModelAttributeMethodP
|
||||
*/
|
||||
@Override
|
||||
public boolean supportsParameter(MethodParameter parameter) {
|
||||
return parameter.getParameterType().isInterface();
|
||||
|
||||
Class<?> type = parameter.getParameterType();
|
||||
|
||||
if (!type.isInterface()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Fallback for only user defined interfaces
|
||||
for (String prefix : IGNORED_PACKAGES) {
|
||||
if (ClassUtils.getPackageName(type).startsWith(prefix)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
23
src/test/java/SampleInterface.java
Normal file
23
src/test/java/SampleInterface.java
Normal file
@@ -0,0 +1,23 @@
|
||||
import org.springframework.data.web.ProxyingHandlerMethodArgumentResolverUnitTests;
|
||||
|
||||
/*
|
||||
* Copyright 2017 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @author Oliver Gierke
|
||||
* @see ProxyingHandlerMethodArgumentResolverUnitTests
|
||||
*/
|
||||
public interface SampleInterface {}
|
||||
26
src/test/java/example/SampleDto.java
Normal file
26
src/test/java/example/SampleDto.java
Normal file
@@ -0,0 +1,26 @@
|
||||
package example;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat.ISO;
|
||||
|
||||
public interface SampleDto {
|
||||
|
||||
String getName();
|
||||
|
||||
@DateTimeFormat(iso = ISO.DATE)
|
||||
Date getDate();
|
||||
|
||||
SampleDto.Address getBillingAddress();
|
||||
|
||||
Collection<SampleDto.Address> getShippingAddresses();
|
||||
|
||||
public interface Address {
|
||||
|
||||
String getZipCode();
|
||||
|
||||
String getCity();
|
||||
}
|
||||
}
|
||||
24
src/test/java/example/SampleInterface.java
Normal file
24
src/test/java/example/SampleInterface.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package example;
|
||||
import org.springframework.data.web.ProxyingHandlerMethodArgumentResolverUnitTests;
|
||||
|
||||
/*
|
||||
* Copyright 2017 the original author or authors.
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @author Oliver Gierke
|
||||
* @see ProxyingHandlerMethodArgumentResolverUnitTests
|
||||
*/
|
||||
public interface SampleInterface {}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright 2017 the original author or authors.
|
||||
*
|
||||
* Licensed 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.springframework.data.web;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import example.SampleInterface;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.core.convert.support.DefaultConversionService;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link ProxyingHandlerMethodArgumentResolver}.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @soundtrack Karlijn Langendijk & Sönke Meinen - Englishman In New York (Sting,
|
||||
* https://www.youtube.com/watch?v=O7LZsqrnaaA)
|
||||
*/
|
||||
public class ProxyingHandlerMethodArgumentResolverUnitTests {
|
||||
|
||||
ProxyingHandlerMethodArgumentResolver resolver = new ProxyingHandlerMethodArgumentResolver(
|
||||
new DefaultConversionService());
|
||||
|
||||
@Test // DATACMNS-776
|
||||
public void supportsUnannotatedInterfaceFromUserPackage() throws Exception {
|
||||
|
||||
Method method = Controller.class.getMethod("with", SampleInterface.class);
|
||||
MethodParameter parameter = new MethodParameter(method, 0);
|
||||
|
||||
assertThat(resolver.supportsParameter(parameter), is(true));
|
||||
}
|
||||
|
||||
@Test // DATACMNS-776
|
||||
public void doesNotSupportUnannotatedInterfaceFromSpringNamespace() throws Exception {
|
||||
|
||||
Method method = Controller.class.getMethod("with", UnannotatedInterface.class);
|
||||
MethodParameter parameter = new MethodParameter(method, 0);
|
||||
|
||||
assertThat(resolver.supportsParameter(parameter), is(false));
|
||||
}
|
||||
|
||||
@Test // DATACMNS-776
|
||||
public void doesNotSupportCoreJavaType() throws Exception {
|
||||
|
||||
Method method = Controller.class.getMethod("with", List.class);
|
||||
MethodParameter parameter = new MethodParameter(method, 0);
|
||||
|
||||
assertThat(resolver.supportsParameter(parameter), is(false));
|
||||
}
|
||||
|
||||
interface UnannotatedInterface {}
|
||||
|
||||
interface Controller {
|
||||
|
||||
void with(UnannotatedInterface param);
|
||||
|
||||
void with(SampleInterface param);
|
||||
|
||||
void with(List<Object> param);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015 the original author or authors.
|
||||
* Copyright 2015-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,12 +18,11 @@ package org.springframework.data.web.config;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import example.SampleDto;
|
||||
import example.SampleDto.Address;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import org.springframework.data.web.config.SampleController.SampleDto.Address;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat.ISO;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
||||
@@ -52,23 +51,4 @@ public class SampleController {
|
||||
|
||||
return "view";
|
||||
}
|
||||
|
||||
interface SampleDto {
|
||||
|
||||
String getName();
|
||||
|
||||
@DateTimeFormat(iso = ISO.DATE)
|
||||
Date getDate();
|
||||
|
||||
Address getBillingAddress();
|
||||
|
||||
Collection<Address> getShippingAddresses();
|
||||
|
||||
interface Address {
|
||||
|
||||
String getZipCode();
|
||||
|
||||
String getCity();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user