Anonymous
Круглая зависимость между аутентификацией, пользовательским конвейером и контроллером
Сообщение
Anonymous » 16 мар 2025, 11:42
Я разрабатываю микросервис 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
1742114523
Anonymous
Я разрабатываю микросервис Spring Boot 3.x с использованием Java 21 и шестиугольной архитектуры. Тем не менее, мое приложение не может запустить из-за круговой зависимости, включающей аутентификацию serviceImpl, userRepositoryImpl и аутентификацию.[code]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); } [/code] Я попытался удалить @repository из userRepositoryImpl и вручную вручную в приложении. циклы? Подробнее здесь: [url]https://stackoverflow.com/questions/79511582/circular-dependency-between-authenticationservice-userrepository-and-controlle[/url]