0

I'm developing an easy sample application. One component is a gateway service using Spring Boot and Reactive Spring Data for Mongo, because that's where I want to store user and login informations.

For testing out different solutions, I wanted to use MongoDB Atlas. So, I set up an application. But when I want to save just a sample user, nothing happens, the data is not saved to the database. However it looks like the application is connected to the MongoDb Atlas. No error logs about failed connections.

This is the main class, where I have the @EnableReactiveMongoRepositories annotation:

@SpringBootApplication
@EnableReactiveMongoRepositories("com.bkk.sm.authentication.repository")
public class GatewayApplication {

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

Here is how I set up Mongo in application.yml and the repository:

spring:
  data:
    mongodb:
      database: users
      uri: mongodb+srv://${MONGO_USER}:${MONGO_PASSWORD}@taocluster.qa3sd.mongodb.net/users?retryWrites=true&w=majority
@Repository
public interface ReactiveUserRepository extends ReactiveMongoRepository<User, String> {
    Mono<User> findByUsername(String username);

}

I don't use any specific reactive MongoDB config, I don't extend the AbstractReactiveMongoConfiguration (this is really just a bout to experiment how does this work) and I use the defaults.

In my UserDetailsServiceImpl, I try to save a sample record, just right after the bean is constructed:

@Slf4j
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    private ReactiveUserRepository repository;

    public UserDetailsServiceImpl(ReactiveUserRepository repository) {
        this.repository = repository;
    }

    @PostConstruct
    public void setup() {
     BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
     String pwd = encoder.encode("user");
     User user = User.builder()
             .username("user")
             .password(pwd)
             .accountExpired(false)
             .accountLocked(false)
             .activationCode(null)
             .activatedTime(Date.from(Instant.now()))
             .email("user@user.com")
             .enabled(true)
             .firstName("User")
             .failedLoginAttempts(0)
             .lastModificationTime(Date.from(Instant.now()))
             .lastName("User")
             .middleName("User")
             .passwordExpiryTime(Date.from(Instant.now()))
             .registrationTime(Date.from(Instant.now()))
             .roles(List.of(CompanyRole.builder().companyCode("bkk")
                     .companyName("Beszterce KK")
                     .role(Role.ROLE_USER)
                     .build())
             )
             .passwordExpiryTime(null)
             .version(0)
             .build();
     this.repository.save(user).map(user1 -> {
         log.info("User saved. {}", user1);
         return user1;
     }).onErrorResume(Objects::nonNull, throwable -> {
         log.error("Something is not right here.", throwable);
         return Mono.error(throwable);
     }).switchIfEmpty(Mono.defer(() -> {
         log.info("Cannot save ure={}", user.toString());
         return Mono.error(new Exception("WTF?"));
     }));
    }
... SOME MORE METHODS COME HERE
}

When it executes the this.repository.save(user) line, nothing happens. Well, I tried to debug and went deeper into the framework but ultimately, nothing happens. That's why I added some log messages. But nothing. If I put a breakpoint to the map or onErrorResume or switchIfEmpty branches, the execution doesn't stop there. No log is written to console other that this line:

2022-04-09 00:02:46.061  INFO 72528 --- [ntLoopGroup-3-7] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:7, serverValue:78530}] to taocluster-shard-00-02.qa3sd.mongodb.net:27017

And here is my data object where I declare the collection name:

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "users")
public class User implements UserDetails {

    @Id
    private String id;

    @Indexed
    @NonNull
    private String username;

... SOME MORE FIELDS COME HERE ...
}

So, my question is, what am I doing wrong? Why I don't see anything added to my MongoDB Atlas sample database? Where I just set the 0.0.0.0/0 for accepting connections from everywhere for the time being of testing this stuff out.

Any help would be appreciated.

bkk
  • 307
  • 5
  • 22
  • It's very hard to understand the problem from your example that has many unnecessary details . Try to create minimal app to test review your question. We are using Mongo Atlas with reactive without any issues. – Alex Apr 09 '22 at 03:38
  • Hi Alex! Thanks for your comment. I think, I've given every necessary information there what you need to set up a Mongo connection in your application and actually use it. The main class file shows the repository enabler annotation. I provided the configuration what is used by Spring auto config to initiate the connection. Also added the repository what does the leg work and the service class what uses the repository. And also the document read from the Mongo database. I don't think it can be defined easier. Anyways, in the meantime I installed Mongo on my own cluster and that just works. – bkk Apr 13 '22 at 21:50
  • There's separate "network access" menu in Atlas where you can enable "0.0.0.0/0" for accepting connections – solomkinmv Jul 11 '22 at 22:07

0 Answers0