在Spring 3.2.5→4.0.0版本更新之后尝试编译源代码时,出现奇怪的行为。Spring4 MVC单元测试不编译
故障代码段从ApplicationControllerTest.java
(它等同于从documentation代码):
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
...
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
错误:
COMPILATION ERROR : /C:/Development/.../war/src/test/java/org/.../web/controller/ApplicationControllerTest.java:[59,61] C:\Development\...\war\src\test\java\org\...\web\controller\ApplicationControllerTest.java:59: incompatible types; inferred type argument(s) java.lang.Object do not conform to bounds of type variable(s) B found : <B>org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder<B> required: java.lang.Object
如果观察到MockMvcBuilders
源,一个可以看到的区别:
弹簧4.0.0:
public static <B extends DefaultMockMvcBuilder<B>> DefaultMockMvcBuilder<B> webAppContextSetup(WebApplicationContext context) {
return new DefaultMockMvcBuilder<B>(context);
}
春3.2.5:
public static DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>> webAppContextSetup(WebApplicationContext context) {
return new DefaultMockMvcBuilder<DefaultMockMvcBuilder<?>>(context);
}
我试图让它编译没有成功。
其实Spring documentation说框架应该是Java 1.6.0_10兼容。我使用Java 1.6.0_45。
看起来他们交换了一个无界的通配符类型有界的类型参数。我想你可能已经发现了一个问题。 –
是的,我看到了变化,他们似乎有道理。我不明白为什么编译器无法应付这种参数化,我该如何解决JDK 1.6.0_45(或任何其他1.6.x版本)的问题。 –