我正在尝试按功能使用包(例如,已完成here)。我使用com.company.project.user
和UserRepository
接口创建了UserService
个包,仅公开了UserService
个。我还有一个子包web
,其中包含UserController
和UserDto
。
在这个web
包中,我有一个测试:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureJsonTesters
public class UserDtoTest {
private JacksonTester<UserDto> tester;
@Test
public void testSerialize() throws IOException {
String id = UUID.fromString("939d1c2f-b1f4-49c6-9839-f088401f6781").toString();
String username = "wim.deblauwe";
UserRole role = UserRole.ADMIN;
JsonContent<UserDto> content = tester.write(new UserDto(id, username, role));
assertThat(content).isEqualToJson("userdto.json");
}
}
这使用Spring Boot 1.4.0.M3。当我单独运行或运行它时,此测试运行正常,将在IntelliJ中进行所有测试。但是,当我从Maven(版本3.3.9)运行它时,我遇到了这个问题:
java.lang.IllegalAccessError: class com.company.project.user。$ Proxy169无法访问它 superinterface com.company.project.user.UserRepository
堆栈跟踪的更大部分:
引起:org.springframework.beans.factory.BeanCreationException: 创建名为'userRepository'的bean时出错:init的调用 方法失败;嵌套异常是java.lang.IllegalAccessError:class com.company.project.user。$ Proxy169无法访问它 superinterface com.company.project.user.UserRepository at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 在 org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:187) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1208) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1048) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018) 在 org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:834) 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ...省略了59个常见帧引起的:java.lang.IllegalAccessError: class com.company.project.user。$ Proxy169无法访问它 superinterface com.company.project.user.UserRepository at java.lang.reflect.Proxy.defineClass0(Native Method)at java.lang.reflect.Proxy.access $ 300(Proxy.java:228)at java.lang.reflect.Proxy $ ProxyClassFactory.apply(Proxy.java:642)at java.lang.reflect.Proxy $ ProxyClassFactory.apply(Proxy.java:557)at java.lang.reflect.WeakCache $ Factory.get(WeakCache.java:230)at java.lang.reflect.WeakCache.get(WeakCache.java:127)at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:419)at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:719)at org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:122) 在 org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:222) 在 org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:266) 在 org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:252) 在 org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ...省略了71个常见帧
为了让它在Maven中运行,我只需要改变:
interface UserRepository extends CrudRepository<User, UserId>, UserRepositoryCustom {
Optional<User> findByUsername(String username);
}
到
public interface UserRepository extends CrudRepository<User, UserId>, UserRepositoryCustom {
Optional<User> findByUsername(String username);
}
知道为什么我需要这样做吗?它可能是Spring Data中的一个错误吗?
答案 0 :(得分:0)
这是由bug in Spring Boot引起的。有几种解决方法:
WebEnvironment.RANDOM_PORT
标记使用WebEnvironment.DEFINED_PORT
或@DirtiesContext
的所有测试。