Pacote não encontrado (Multi-módulo de projeto Primavera)

Leonardo Leandro:

Eu usei Primavera Initializr para criar dois módulos:

API (que é Spring Web)

db (que está a mola de dados MongoDB)

Eu colocá-los no mesmo projeto, de forma que eles estão agora submódulos.

Antes dos testes, criando, eu posso mvn clean installcom uma mensagem de construir o sucesso. Não há problema.

No entanto, se eu tentar criar um teste (ou até mesmo usá-lo em um controlador de dentro de principal estrutura), onde ele usa um db classe repositório de módulo, para obter dados do MongoDB, mvn clean installvai acusar pacote não existe, apesar IntelliJ pode identificar e índice -lo e arquivo existe.

A estrutura é:

api
\- src/main/java
  \- com.example.api.controllers
    \- UserController.java
\- src/test/java
  \- com.example.api.controllers
    \- UserControllerTest.java
db
\- src/main/java
  \- com.example.db.repositories
    \- UserRepository.java
model
\- src/main/java
  \- com.example.model
    \- User.java

ApiApplication.java

package com.example.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class ApiApplication {

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

}

UserController.java

package com.example.api.controllers;

import com.example.api.Constants;
import com.example.db.repositories.UserRepository;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping(Constants.V1 + "user")
    public User getUser() {
        User user = new User("John");
        userRepository.save(user);
        return user;
    }
}

Agora, se eu correr mvn clean install, vou receber o erro maven dizendo package com.example.db.repositories does not exist.

Módulo db é uma dependência no módulo API e api módulo está previsto para ser compilado após db em pom dos pais.

pai - pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>model</module>
        <module>db</module>
        <module>api</module>
    </modules>

</project>

db - pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>db</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

</project>

api - pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>LATEST</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>api</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>db</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Como fazer maven ver este pacote?

Novo erro após tê-lo encontrar o pacote

2019-01-14 19:16:55.060  WARN 31104 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.db.repositories.UserRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
2019-01-14 19:16:55.066  INFO 31104 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2019-01-14 19:16:55.087  INFO 31104 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-01-14 19:16:55.224 ERROR 31104 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field userRepository in com.example.api.controllers.UserController required a bean of type 'com.example.db.repositories.UserRepository' that could not be found.

The injection point has the following annotations:
        - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.example.db.repositories.UserRepository' in your configuration.
thst:

Springboot autodiscovery descerá apenas a partir de seu baixo classe de configuração. sua aplicação está em

com.example.api

mas o repo está em

com.example.db

adicione um caminho de pesquisa para autodiscover .db bem ou mover sua classe aplicativo para com.example ou o código db para com.example.api

Opção 1

@ComponentScan(“com.example”)
@SpringBootApplication
public class ExampleApplication  {

opção 2

@ComponentScan({"com.example.api","com.example.db"})
@SpringBootApplication
public class ExampleApplication {

Você também pode adicionar o atributo scanBasePackages à anotação SpringbootApplication para o mesmo efeito.

@SpringBootApplication(scanBasePackages= {"com.example.api","com.example.db"})
public class ExampleApplication {

veja a documentação aqui https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html#scanBasePackages--

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=173817&siteId=1
Recomendado
Clasificación