giannino1995 ha scritto:
I due database che uso sul PC, MongoDB ed Embedded MongoDB, per i quali sono presenti le 2 dipendenze nel pom.xml sono entrambe usate in fase di 'test' per cui non comprendo neppure il tuo suggerimento.
Ecco la mia dimostrazione:
pom.xml
Ho usato l'ultimissima versione di Spring Boot, 2.3.3.RELEASE. Le dipendenze sono queste:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
(il devtools in effetti non serve ma ce l'avevo già lì .... male non fa)
NOTA che de.flapdoodle.embed.mongo ha scope
test
application.properties che contiene SOLO questa riga:
spring.data.mongodb.uri = mongodb://localhost:27017/mongodemo
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "infos")
public class Info {
private ObjectId id;
private String message;
// ... getter/setter .... (omessi solo per BREVITÀ)
@Override
public String toString() {
return "Info[id=" + id + ", message=" + message + "]";
}
}
@Controller
public class ProvaMongoController {
private static final Logger logger = LoggerFactory.getLogger(ProvaMongoController.class);
@Autowired
private MongoTemplate mongoTemplate;
@GetMapping(value = "/infos", produces = "text/plain")
public @ResponseBody String infos() {
Document result = mongoTemplate.getDb().runCommand(new Document("buildInfo", 1));
logger.info("DB INFO -----> {}", result);
Info info = new Info();
info.setMessage("Messaggio da ProvaMongoController al " + new Date());
mongoTemplate.save(info);
List<Info> infos = mongoTemplate.findAll(Info.class);
return infos.stream().map(Info::toString).collect(Collectors.joining("\r\n"));
}
}
E infine una classe di test.
@RunWith(SpringRunner.class)
@DataMongoTest
public class MongoTest {
private static final Logger logger = LoggerFactory.getLogger(MongoTest.class);
@Autowired
private MongoTemplate mongoTemplate;
@Test
public void testInfos() {
Document result = mongoTemplate.getDb().runCommand(new Document("buildInfo", 1));
logger.info("DB INFO -----> {}", result);
Info info = new Info();
info.setMessage("Messaggio da MongoTest al " + new Date());
mongoTemplate.save(info);
List<Info> infos = mongoTemplate.findAll(Info.class);
assertThat(infos).hasSize(1);
assertThat(infos.get(0).getMessage()).startsWith("Messaggio da MongoTest");
}
}
RUN APPLICAZIONE:
Se avvio l'applicazione da Eclipse (o da prompt con
mvn spring-boot:run), quello che ottengo e vedo è:
a) ad ogni chiamata a http://localhost:8080/infos la lista di Info aumenta e da browser vedo es.:
Info[id=5f3d39ff8acf2b0985c1883d, message=Messaggio da ProvaMongoController al Wed Aug 19 16:41:03 CEST 2020]
Info[id=5f3d3a118acf2b0985c1883e, message=Messaggio da ProvaMongoController al Wed Aug 19 16:41:21 CEST 2020]
Info[id=5f3d3a5778e0794fad18fcfb, message=Messaggio da ProvaMongoController al Wed Aug 19 16:42:31 CEST 2020]
Info[id=5f3d3a8d78e0794fad18fcfc, message=Messaggio da ProvaMongoController al Wed Aug 19 16:43:25 CEST 2020]
Info[id=5f3d3ae865ee9f11766cf557, message=Messaggio da ProvaMongoController al Wed Aug 19 16:44:56 CEST 2020]
Anche se termino e poi riavvio la applicazione. E i dati li VEDO dal MongoDB Compass nel db "mongodemo", collection "infos".
b) Nel log vedo il mio info
DB INFO -----> Document{{version=4.2.0, gitVersion=a4b751dcf51dd249c5865812b390cfd1c0129c30, targetMinOS=Windows 7/Windows Server 2008 R2, modules= blablablabla.......
Questo MongoDB 4.2.0 è il MIO MongoDB che io avevo a suo tempo INSTALLATO sul mio pc.
RUN TEST:
Se avvio i test da Eclipse (o da prompt con
mvn test), quello che ottengo e vedo è:
a) Il test passa con successo (i due assert sono validi). Perché usa il MongoDB "in memory" tirato dentro dal de.flapdoodle. Con quel metodo di test viene inserito un solo documento Info, poi terminato il testing il MongoDB "sparisce". Il test si può quindi eseguire quante volte si vuole (perché i dati NON sono "persistenti"!).
b) Nel log vedo il mio info
DB INFO -----> Document{{version=3.5.5, gitVersion=98515c812b6fa893613f063dae568ff8319cbfbd, targetMinOS=Windows Vista/Windows Server 2008, modules= blablablabla.......
Questo NON è il mio MongoDB che ho installato!!! Questo è il MongoDB "in memory" tirato dentro dal de.flapdoodle!
ATTENZIONE: se tolgo <scope>test</scope> dalla dependency de.flapdoodle.embed.mongo succede che il MongoDB "in memory" viene usato per i test E per l'avvio normale della applicazione. Potrebbe essere quello che si voleva .. o non si voleva (per me no, NON è quello che intenderei/vorrei io).
Con il risultato che ad ogni avvio della applicazione, la collection infos è sempre vuota (e non tocca minimamente la infos sul mio "vero" MongoDB).
CONCLUSIONE: ti chiederei cosa ti risulta chiaro. Ma forse è meglio il contrario: cosa NON ti è chiaro in tutto questo?