使Spring Data repo包本地

时间:2016-05-20 09:09:40

标签: java spring maven spring-data

我正在尝试按功能使用包(例如,已完成here)。我使用com.company.project.userUserRepository接口创建了UserService个包,仅公开了UserService个。我还有一个子包web,其中包含UserControllerUserDto

在这个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中的一个错误吗?

1 个答案:

答案 0 :(得分:0)

这是由bug in Spring Boot引起的。有几种解决方法:

  1. 使用WebEnvironment.RANDOM_PORT标记使用WebEnvironment.DEFINED_PORT@DirtiesContext的所有测试。
  2. 切换到Undertow或Jetty。