Круглая зависимость между аутентификацией, пользовательским конвейером и контроллеромJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Круглая зависимость между аутентификацией, пользовательским конвейером и контроллером

Сообщение Anonymous »

Я разрабатываю микросервис Spring Boot 3.x с использованием Java 21 и шестиугольной архитектуры. Тем не менее, мое приложение не может запустить из-за круговой зависимости, включающей аутентификацию serviceImpl, userRepositoryImpl и аутентификацию.

Код: Выделить всё

Error starting ApplicationContext.  The dependencies of some of the beans in the application context form a cycle:

authenticationController defined in file [.../AuthenticationController.class]
↓
authenticationServiceImpl defined in file [.../AuthenticationServiceImpl.class]
┌─────┐
|  userRepositoryImpl defined in file [.../UserRepositoryImpl.class]
└─────┘
< /code>
Структура проекта: < /p>
📂 auth-service/
├── application/
│   ├── service/
│   │   ├── AuthenticationServiceImpl.java
|   |   ├── JwtService.java
│
├── domain/
│   ├── model/
│   │   ├── User.java
|   |   ├── Role.java
│
├── ports/
│   ├── AuthenticationServicePort.java
│   ├── UserRepositoryPort.java
│   ├── TokenPort.java
│
├── adapters/
│   ├── inbound/
│   │   ├── controller/
│   │   │   ├── AuthenticationController.java
│   ├── outbound/
│   │   ├── repository/
│   │   │   ├── RoleEntity.java
│   │   │   ├── UserEntity.java
│   │   │   ├── UserRepositoryImpl.java
│   │   │   ├── UserRepository.java
│   │   ├── security/
│   │   │   ├── UserDetailsAdapter.java
│
├── config/
│   ├── ApplicationConfig.java
├── utils/
│   ├── Mapper.java
< /code>
контроллер: < /p>
@RestController
@RequestMapping("/api/v1/auth")
public class AuthenticationController {
private final AuthenticationServicePort authenticationServicePort;

public AuthenticationController(AuthenticationServicePort authenticationServicePort) {
this.authenticationServicePort = authenticationServicePort;
}

@PostMapping("/register")
public ResponseEntity register(
@Valid @RequestBody RegisterRequestDto request
) {
return ResponseEntity.ok(authenticationServicePort.register(request));
}

@PostMapping("/login")
public ResponseEntity authenticate(
@RequestBody AuthenticationRequestDto request
) {
return ResponseEntity.ok(authenticationServicePort.authenticate(request));
}
}
< /code>
service < /p>
@Service
public class AuthenticationServiceImpl implements AuthenticationServicePort {
private final UserRepositoryPort userRepositoryPort;
private final PasswordEncoder passwordEncoder;
private final TokenPort tokenPort;
private final AuthenticationManager authenticationManager;

public AuthenticationServiceImpl(UserRepositoryPort userRepositoryPort, PasswordEncoder passwordEncoder, TokenPort tokenPort, AuthenticationManager authenticationManager) {
this.userRepositoryPort = userRepositoryPort;
this.passwordEncoder = passwordEncoder;
this.tokenPort = tokenPort;
this.authenticationManager = authenticationManager;
}

@Override
public AuthenticationResponseDto register(RegisterRequestDto request) {
User user = new User(
null,
request.getFirstname(),
request.getLastname(),
request.getEmail(),
passwordEncoder.encode(request.getPassword()),
Role.USER,
null, null,
request.getPhoneNumber(),
null, null
);

userRepositoryPort.save(user);

Map extraClaims = new HashMap();
extraClaims.put("ROLE", Role.USER);
String jwtToken = tokenPort.generateToken(extraClaims, new UserDetailsAdapter(user));

return new AuthenticationResponseDto(jwtToken);
}

@Override
public AuthenticationResponseDto authenticate(AuthenticationRequestDto request) {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
request.getEmail(),
request.getPassword()
)
);

User user = userRepositoryPort.findByEmail(request.getEmail())
.orElseThrow();

Map  extraClaims = new HashMap();
extraClaims.put("ROLE", user.getRole());

String jwtToken = tokenPort.generateToken(extraClaims, new UserDetailsAdapter(user));
return new AuthenticationResponseDto(jwtToken);
}
}
< /code>
userRepositoryImpl < /p>
@Repository
public class UserRepositoryImpl implements UserRepositoryPort {

private final UserRepository userRepository;

public UserRepositoryImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}

@Override
public Optional findByEmail(String email) {
return userRepository.findByEmail(email).map(Mapper::toDomain);
}

@Override
public User save(User user) {
UserEntity entity = toEntity(user);
return toDomain(userRepository.save(entity));
< /code>
userRepository < /p>
public interface UserRepository extends JpaRepository {
Optional findByEmail(String email);
}
< /code>
userRepositoryport: < /p>
public interface UserRepositoryPort {
Optional findByEmail(String email);
User save(User user);
}
Я попытался удалить @repository из userRepositoryImpl и вручную вручную в приложении. циклы?


Подробнее здесь: https://stackoverflow.com/questions/795 ... -controlle
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»