简体   繁体   English

将Spring Data Repo软件包设为本地时出现java.lang.IllegalAccessError

[英]java.lang.IllegalAccessError when making Spring Data repo package local

I am trying to use packages by feature (As is done here for example). 我正在尝试按功能使用软件包(例如, 此处已完成)。 I created a com.company.project.user package with my UserRepository and UserService interfaces, making only the UserService public. 我使用UserRepositoryUserService接口创建了com.company.project.user程序包,仅将UserService公开。 I also have a subpackage web that has the UserController and a UserDto . 我也有一个包含UserControllerUserDto的子包web

In this web package, I have a test: 在此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");
    }
}

This uses Spring Boot 1.4.0.M3. 这使用Spring Boot 1.4.0.M3。 This test runs fine when I run it alone or when I run it will all the tests in IntelliJ. 当我单独运行该测试时,或者当我运行它时,IntelliJ中的所有测试都可以正常运行。 However, when I run it from Maven (version 3.3.9), I get this problem: 但是,当我从Maven(版本3.3.9)运行它时,出现此问题:

java.lang.IllegalAccessError: class com.company.project.user.$Proxy169 cannot access its superinterface com.company.project.user.UserRepository java.lang.IllegalAccessError:类com.company.project.user。$ Proxy169无法访问其超级接口com.company.project.user.UserRepository

Bigger part of the stack trace: 堆栈跟踪的较大部分:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; 由以下原因引起:org.springframework.beans.factory.BeanCreationException:创建名称为'userRepository'的bean时出错:调用init方法失败; nested exception is java.lang.IllegalAccessError: class com.company.project.user.$Proxy169 cannot access its superinterface com.company.project.user.UserRepository at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBe 嵌套的异常是java.lang.IllegalAccessError:com.company.project.user。$ Proxy169类无法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.org org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)上的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)上的java:1578) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)上的.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)在org.springframework.beans.factory.support上。 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBe)上的AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) anFactory.java:197) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:187) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1208) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1048) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:834) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ... 59 common frames omitted Caused by: java.lang.IllegalAccessError: class com.company.project.user.$Proxy169 cannot access its superinterface com.company.project.user.UserRepository at java.lang.reflect.Proxy.defineClass0(Native Method) at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:187)上org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1208)上的anFactory.java:197) org.springframework.beans.factory.support上的.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1048)在org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018)在org.springframework.beans.factory.support org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)处的.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:834)...省略了59个常见框架造成原因:java.lang.IllegalAccessError:class com .company.project.user。$ Proxy169无法访问其超级接口com.company.project.user.UserRepository,位于java.lang.reflect.Proxy.defineClass0(本机方法),位于 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) at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109) at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:222) at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:266) at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:252) at 位于java.lang.reflect.Proxy $ ProxyClassFactory.apply(Proxy.java:642)的java.lang.reflect.Proxy.access $ 300(Proxy.java:228)在java.lang.reflect.Proxy $ ProxyClassFactory.apply(Proxy .java:557),位于java.lang.reflect.WeakCache $ Factory.get(WeakCache.java:230),位于java.lang.reflect.WeakCache.get(WeakCache.java:127),位于java.lang.reflect.Proxy。 org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:122)的java.lang.reflect.Proxy.newProxyInstance(Proxy.java:719)的getProxyClass0(Proxy.java:419) org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:222)上的.framework.ProxyFactory.getProxy(ProxyFactory.java:109)在org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport上org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:252)上的.initAndReturn(RepositoryFactoryBeanSupport.java:266) org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ... 71 common frames omitted org.springframework.org上的org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)在org.springframework。 factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)...省略了71个常见框架

To make it work in Maven as well, I just have to change: 为了使其也能在Maven中工作,我只需要更改:

interface UserRepository extends CrudRepository<User, UserId>, UserRepositoryCustom {
    Optional<User> findByUsername(String username);
}

to

public interface UserRepository extends CrudRepository<User, UserId>, UserRepositoryCustom {
    Optional<User> findByUsername(String username);
}

Any idea why I need to do this? 知道为什么我需要这样做吗? Could it be a bug in Spring Data? 难道是Spring Data中的错误?

This is caused by a bug in Spring Boot . 这是由Spring Boot中错误引起的。 There are a couple of workarounds: 有两种解决方法:

  1. Mark any tests that use WebEnvironment.RANDOM_PORT or WebEnvironment.DEFINED_PORT with @DirtiesContext . 使用WebEnvironment.RANDOM_PORT标记所有使用WebEnvironment.RANDOM_PORTWebEnvironment.DEFINED_PORT@DirtiesContext
  2. Switch to Undertow or Jetty. 切换到Underwow或Jetty。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM