Класс не найден из jar из jar зависимостей - PullRequest
0 голосов
/ 12 мая 2019

У меня есть проект, пытающийся построить архитектуру микросервисов.Некоторые из проектов используются для создания jar-файлов (я называю эти проекты «библиотечными проектами») для вызываемых микросервисов.Один из этих микросервисов отвечает за регистрацию и поиск пользователей / клиентов.Все данные хранятся в кластере Cassandra.Один из библиотечных проектов отвечает за предоставление различных услуг / объектов-ценностей на основе Cassandra и т. Д. *

В файле pom микросервиса я включаю банку, созданную проектом библиотеки.Он компилируется, но когда я запускаю службу поддержки клиентов, классы из этой банки не найдены.

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

Description:

Field repository in com.besztercekk.tao.customer.handler.PostUserHandler required a bean of type 'com.besztercekk.tao.cassandra.repository.ReactiveUserRepository' 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.besztercekk.tao.cassandra.repository.ReactiveUserRepository' in your configuration.

Вот некоторые фрагменты кода, но я могу прикрепить все, что вам нужно.

Этофайл pom для микросервисаКласс, который не найден, находится в этой зависимости: tao-elszamolas-cassandra.

<?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>

    <artifactId>tao-elszamolas-customer-service</artifactId>
    <packaging>jar</packaging>

    <name>tao-elszamolas-customer-service</name>
    <description>TAO elszamolas customer backend service</description>

    <parent>
        <groupId>com.besztercekk.tao</groupId>
        <artifactId>tao-elszamolas-spring</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath> 
    </parent>

    <dependencies>
        <!-- Spring Cloud Eureka client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!-- Spring Cloud config client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>

        <!-- Webflux -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Reactive cassandra -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-cassandra-reactive</artifactId>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.1-jre</version>
        </dependency>

        <!-- TAO elszamolas dependencies -->
        <dependency>
            <groupId>com.besztercekk.tao</groupId>
            <artifactId>tao-elszamolas-cassandra</artifactId>
        </dependency>

        <dependency>
            <groupId>com.besztercekk.tao</groupId>
            <artifactId>tao-elszamolas-jwt</artifactId>
        </dependency>
    </dependencies>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>

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

Это файл pom для проекта, который содержит отсутствующий класс:

<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>

    <artifactId>tao-elszamolas-cassandra</artifactId>
    <packaging>jar</packaging>

    <name>tao-elszamolas-cassandra</name>
    <description>TAO elszámolás Spring alapú több projektben használt komponensek gyűjtő projektje</description>

    <parent>
        <groupId>com.besztercekk.tao</groupId>
        <artifactId>tao-elszamolas-spring</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- Reactive cassandra -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-cassandra-reactive</artifactId>
        </dependency>
    </dependencies>

</project>

Здеськласс, из которого исходит ошибка:

@Component
@Validator(UserDataValidator.class)
public class PostUserHandler extends AbstractValidationHandler<User, ChainableValidator> {

    @Autowired
    private ReactiveUserRepository repository;

    @Autowired
    private PasswordEncoder passwordEncoder;

    public PostUserHandler() {
        super(User.class);
    }

    @Override
    protected Mono<ServerResponse> processRequest(User body, ServerRequest request) {
        return repository.save(enrichUser(body, UUIDs.random().toString()))
                .flatMap(updatedUser -> {
                    sendRegistrationCode();
                    return ok(updatedUser);
                })
                .onErrorResume(IllegalArgumentException.class, e -> ServerResponse.badRequest().build())
                .switchIfEmpty(ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR).build());
    }

    @Override
    protected Mono<User> extractContent(ServerRequest request) {
        return request.bodyToMono(User.class);
    }

    private void sendRegistrationCode() {
        //TODO: Send Kafka message to email component
    }

    private Mono<ServerResponse> ok(User c) {
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromPublisher(Mono.just(c), User.class));
    }

    private User enrichUser(User user, String activationCode) {
        return User.builder()
                .authorities(user.getAuthorities())
                .email(user.getEmail())
                .enabled(user.isEnabled())
                .firstName(user.getFirstName())
                .id(UUIDs.timeBased())
                .lastName(user.getLastName())
                .middleName(user.getMiddleName())
                .password(passwordEncoder.encode(user.getPassword()))
                .registrationTime(LocalDateTime.now())
                .passwordExpiryTime(LocalDateTime.now())
                .roles(user.getRoles())
                .username(user.getUsername())
                .accountExpired(false)
                .accountLocked(false)
                .activationCode(activationCode)
                .build();
    }

}

Любая помощь приветствуется!

ОБНОВЛЕНИЕ (ДОПОЛНИТЕЛЬНАЯ ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ):

Вот основной класс, содержащий компонент сканирования.

@SpringBootApplication
@EnableEurekaClient
@ComponentScan(basePackages = {"com.besztercekk.tao.customer", "com.besztercekk.tao.cassandra"})
public class CustomerBackendApplication {

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

Вот класс репозитория:

package com.besztercekk.tao.cassandra.repository;

import java.util.UUID;

import org.springframework.data.cassandra.repository.ReactiveCassandraRepository;
import org.springframework.stereotype.Component;

import com.besztercekk.tao.cassandra.model.User;

import reactor.core.publisher.Mono;

/**
 * This interface provides reactive {@link User} services.
 */
public interface ReactiveUserRepository extends ReactiveCassandraRepository<User, UUID> {

    Mono<User> findByUsername(String username);

    Mono<User> findByEmail(String email);
}

Также попытался добавить аннотации @Component и @Repository в этот интерфейс, просто чтобыувидеть его эффект.: -)

Моя другая идея заключалась в программном добавлении компонента в контекст после перезапуска.Но это всего лишь интерфейс, поэтому не уверен, что он вообще сработает.

Третья идея заключалась в том, чтобы обернуть этот интерфейс в класс обслуживания, и его легко добавить программно.

Но яочень хочу, чтобы он был добавлен автоматически, без написания кода.

This is the package hierarchy in the library project

1 Ответ

0 голосов
/ 13 мая 2019

Попробуйте добавить следующую аннотацию к любому из @Configuration классов:

@EnableReactiveCassandraRepositories
@Configuration
class MyConfiguration() {
 //code 
}

Приведенный выше код позволяет Spring автоматически сканировать и создавать компонент реализации по умолчанию для вашего интерфейса ReactiveUserRepository.

Также аннотируйте интерфейс как:

@Repository
public interface ReactiveUserRepository extends ReactiveCassandraRepository<User, UUID> {

    Mono<User> findByUsername(String username);

    Mono<User> findByEmail(String email);
}

Для более подробной информации читайте: https://dzone.com/articles/reactive-streams-with-spring-data-cassandra

Кроме того, если вы хотите получить более подробную информацию об аннотациях, прочитайте аналогичный пост:

как работает аннотация @Repository в Java Spring?

...