Multiple MongoDB Connectors with SpringBoot REST api

Viewed 473

I have three databases and I used MongoTemplate to have possibility connect to these databases from my application. but when I use for example POST Method in Postman, I have error 404, not found. In the console anything is fine and when I try http://localhost:8080/, also I have this error There was an unexpected error (type=Not Found, status=404). No message available. I searched too much and read so many things for example like https://dzone.com/articles/multiple-mongodb-connectors-with-spring-boot, but I could not undesrtood how can I define multiple MongoDB Connectors and fix this problem.

The MultipleMongoConfige:

    package spring.mongo.thesis.config;

import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;

import com.mongodb.MongoClient;

import lombok.RequiredArgsConstructor;

@Configuration
@RequiredArgsConstructor
@EnableConfigurationProperties(MultipleMongoProperties.class)
public class MultipleMongoConfig {
    private final MultipleMongoProperties mongoProperties = new MultipleMongoProperties();
    @Primary
    @Bean(name = "primaryMongoTemplate")
    public MongoTemplate primaryMongoTemplate() throws Exception {
        return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
    }
    @Bean(name = "secondaryMongoTemplate")
    public MongoTemplate secondaryMongoTemplate() throws Exception {
        return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
    }
    @Bean(name = "thirdMongoTemplate")
    public MongoTemplate thirdMongoTemplate() throws Exception {
        return new MongoTemplate(thirdFactory(this.mongoProperties.getThird()));
    }
    @Bean
    @Primary
    public MongoDbFactory primaryFactory(final MongoProperties mongo) throws Exception {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }
    @Bean
    public MongoDbFactory secondaryFactory(final MongoProperties mongo) throws Exception {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }
    @Bean
    public MongoDbFactory thirdFactory(final MongoProperties mongo) throws Exception {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }


}

The PrimaryMongoConfig:

    package spring.mongo.thesis.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration
@EnableMongoRepositories(basePackages = "spring.mongo.thesis.repository.primary",
mongoTemplateRef = "primaryMongoTemplate")
public class PrimaryMongoConfig {

}
The MultipleMongoProperty:

    package spring.mongo.thesis.config;

import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "mongodb")
public class MultipleMongoProperties {
    private MongoProperties primary = new MongoProperties();
    private MongoProperties secondary = new MongoProperties();
    private MongoProperties third = new MongoProperties();


    public MongoProperties getPrimary() {
        return primary;
    }
    public void setPrimary(MongoProperties primary) {
        this.primary = primary;
    }
    public MongoProperties getSecondary() {
        return secondary;
    }
    public void setSecondary(MongoProperties secondary) {
        this.secondary = secondary;
    }
    public MongoProperties getThird() {
        return third;
    }
    public void setThird(MongoProperties third) {
        this.third = third;
    }



}

The PlayerController:

     package spring.mongo.thesis.controller.primary;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import spring.mongo.thesis.repository.primary.PlayerModel;
import spring.mongo.thesis.repository.primary.PlayerRepository;

@RestController
@RequestMapping("/player")
public class PlayerController {
    @Autowired
    private PlayerRepository repo;

    //Getting Player ID
    @GetMapping("/{nickname}")
    public ResponseEntity<?>  getPlayerByID(@PathVariable String nickname){


        try {

            PlayerModel p = repo.findById(nickname).get();
            return ResponseEntity.ok(p);

        } catch (Exception e) {
            return ResponseEntity.status(404).body("Not Found!");
        }

    }

    //Get All Players
        @GetMapping
        public List<PlayerModel> getAllPlayers() {
            return repo.findAll();

        }   

    //Delete Players
    @DeleteMapping
    public String deleteAllPlayers(){
        repo.deleteAll();
        return "Deleted!";      
    }




    //@ExceptionHandler(MethodArgumentNotValidException.class)
    //public void handleMissingParams(MissingServletRequestParameterException ex) {
      //  String name = ex.getParameterName();
        //System.out.println(name + " parameter is missing");
        // Actual exception handling
    //}


    //Create Player
    @PostMapping
    public ResponseEntity<?> createPlayer(@RequestBody @Valid PlayerModel player) {
        PlayerModel findplayer = repo.findByNickname(player.getNickname());
        if(findplayer != null) {
            return ResponseEntity.status(409).body("Conflict!");
        }

            repo.save(player);
            return ResponseEntity.status(201).body("Created!");         

    }



    //Delete player By ID
    @DeleteMapping("/{nickname}")
    public ResponseEntity<?> deletePlayerByID(@PathVariable String nickname){
        try {

            PlayerModel p = repo.findById(nickname).get();
            repo.deleteById(nickname);
            return ResponseEntity.ok(p);

        } catch (Exception e) {
            return ResponseEntity.status(404).body("Not Found!");
        }
    }

    //Update Player By ID
    @PutMapping("/{nickname}")
    public ResponseEntity<?> updatePlayerByID(
            @PathVariable("nickname")String nickname,
            @RequestBody @Valid PlayerModel player){
        PlayerModel findplayer = repo.findByNickname(player.getNickname());
        if(findplayer == null)
            return ResponseEntity.status(404).
                    body("There is not Player with indicated Nickname!");
        else
            player.setNickname(nickname);
            repo.save(player);
            return ResponseEntity.ok(player);

    }

}

The PlayerRepository:

    package spring.mongo.thesis.repository.primary;

import org.springframework.data.mongodb.repository.MongoRepository;

public interface PlayerRepository extends MongoRepository<PlayerModel, String>{

    PlayerModel findByNickname(String nickname);

}

The PrimaryMongoConfig:

    package spring.mongo.thesis.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration
@EnableMongoRepositories(basePackages = "spring.mongo.thesis.repository.primary",
mongoTemplateRef = "primaryMongoTemplate")
public class PrimaryMongoConfig {

}

and my Application:

    package spring.mongo.thesis.application;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        System.out.println("Hello World!");

    }

}

The Player Class:

    package spring.mongo.thesis.repository.primary;

import javax.validation.constraints.NotBlank;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "player")
public class PlayerModel {
    @Id
    @NotBlank
    private String nickname;
    @NotBlank
    private String firstname;
    @NotBlank
    private String lastname;
    @NotBlank
    private String email;

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "PlayerModel [nickname=" + nickname + ", firstname=" + firstname + ", lastname=" + lastname + ", email="
                + email + "]";
    }


}

The application.yml:

       spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration
mongodb:
  primary:
    host: localhost
    port: 27017
    database: player-db
  secondary:
    host: localhost
    port: 27017
    database: game-db
  third:
    host: localhost
    port: 27017
    database: score-db
0 Answers
Related