Должна присутствовать хотя бы одна метамодель JPA - PullRequest
0 голосов
/ 09 мая 2018

Я получаю это исключение при тестировании класса моего контроллера

Caused by: java.lang.IllegalArgumentException: At least one JPA metamodel must be present!
    at org.springframework.util.Assert.notEmpty(Assert.java:450)
    at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.<init>(JpaMetamodelMappingContext.java:54)
    at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:88)
    at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:43)
    at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:141)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1761)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1698)

Мой тестовый класс контроллера выглядит следующим образом

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = {SensorController.class}, secure = false)
public class SensorControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private SensorService sensorService;

    .....
}

Мой класс начальной загрузки

@SpringBootApplication(scanBasePackages = "com.javadroider")
@RestController
@EntityScan("com.javadroider.notifier.commons.model")
@EnableJpaRepositories(basePackages = "com.javadroider.notifier")
public class NotifierApplication {

    @GetMapping("/")
    public String home(){
        return "Welcome to Notifier";
    }

    public static void main(String[] args) {
        SpringApplication.run(NotifierApplication.class, args);
    }
}   

Мои зависимости выглядят так

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
            <scope>runtime</scope>
        </dependency>
</dependencies>

Когда я удаляю @EnableJpaRepositories из моего класса Bootstrap, тест контроллера будет успешным. Но приложение не запустится. Сбой с NoSuchBeanDefinitionException.

Я не уверен, связано ли это с тем, как я настроил свое приложение. Все мои классы репозитория и модели находятся в модуле commons, и я ссылаюсь на них в своем основном приложении.

Мой запрос похож на https://github.com/spring-projects/spring-boot/issues/6844

IllegalArgumentException: должна присутствовать хотя бы одна метамодель JPA не решила мою проблему

1 Ответ

0 голосов
/ 09 мая 2018

Аннотация @WebMvcTest не выполняет автоматическую настройку каких-либо репозиториев или компонентов уровня JPA, поскольку в первую очередь она предназначена для тестирования только уровня контроллера.

Ваш основной класс NotifierApplication пытается сделать слишком много. См. Принцип единой ответственности за хорошие методы программирования: https://en.wikipedia.org/wiki/Single_responsibility_principle

Основной класс должен использоваться только для определения вашего приложения, он не должен сам по себе быть @RestController. Например, создайте отдельный класс, NotifierController, и сделайте его своим @RestController с указанными там конечными точками:

@RestController 
public class NotifierController {

    @GetMapping("/")
    public String home(){
        return "Welcome to Notifier";
    }

}

и держите это отдельно от вашего основного класса:

@SpringBootApplication(scanBasePackages = "com.javadroider")
@EntityScan("com.javadroider.notifier.commons.model")
@EnableJpaRepositories(basePackages = "com.javadroider.notifier")
public class NotifierApplication {

    public static void main(String[] args) {
        SpringApplication.run(NotifierApplication.class, args);
    }
} 

Причиной сбоя в том, что у вас было, является то, что ваш WebMvcTest пытался сканировать репозитории JPA и сущности из-за аннотаций в основном классе, но это не настроено для WebMvcTests.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...