BAEL-4025:Spring Data Azure Cosmos DB
This commit is contained in:
		
							parent
							
								
									0c032b90bb
								
							
						
					
					
						commit
						c95dbf8135
					
				
							
								
								
									
										48
									
								
								persistence-modules/spring-data-cosmosdb/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								persistence-modules/spring-data-cosmosdb/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||||
|  | 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  | 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|  | 	<modelVersion>4.0.0</modelVersion> | ||||||
|  | 	<artifactId>spring-data-cosmosdb</artifactId> | ||||||
|  | 	<name>spring-data-cosmos-db</name> | ||||||
|  | 	<description>tutorial for spring-data-cosmosdb</description> | ||||||
|  | 
 | ||||||
|  | 	<parent> | ||||||
|  | 		<groupId>com.baeldung</groupId> | ||||||
|  | 		<artifactId>parent-boot-2</artifactId> | ||||||
|  | 		<version>0.0.1-SNAPSHOT</version> | ||||||
|  | 		<relativePath>../../parent-boot-2</relativePath> | ||||||
|  | 	</parent> | ||||||
|  | 
 | ||||||
|  | 	<properties> | ||||||
|  | 		<java.version>1.8</java.version> | ||||||
|  | 	</properties> | ||||||
|  | 
 | ||||||
|  | 	<dependencies> | ||||||
|  | 		<dependency> | ||||||
|  | 			<groupId>org.springframework.boot</groupId> | ||||||
|  | 			<artifactId>spring-boot-starter-web</artifactId> | ||||||
|  | 		</dependency> | ||||||
|  | 		<dependency> | ||||||
|  | 			<groupId>com.microsoft.azure</groupId> | ||||||
|  | 			<artifactId>spring-data-cosmosdb</artifactId> | ||||||
|  | 			<version>2.3.0</version> | ||||||
|  | 		</dependency> | ||||||
|  | 
 | ||||||
|  | 		<dependency> | ||||||
|  | 			<groupId>org.springframework.boot</groupId> | ||||||
|  | 			<artifactId>spring-boot-starter-test</artifactId> | ||||||
|  | 			<scope>test</scope> | ||||||
|  | 		</dependency> | ||||||
|  | 	</dependencies> | ||||||
|  | 
 | ||||||
|  | 	<build> | ||||||
|  | 		<plugins> | ||||||
|  | 			<plugin> | ||||||
|  | 				<groupId>org.springframework.boot</groupId> | ||||||
|  | 				<artifactId>spring-boot-maven-plugin</artifactId> | ||||||
|  | 			</plugin> | ||||||
|  | 		</plugins> | ||||||
|  | 	</build> | ||||||
|  | 
 | ||||||
|  | </project> | ||||||
| @ -0,0 +1,44 @@ | |||||||
|  | package com.baeldung.spring.data.cosmosdb; | ||||||
|  | 
 | ||||||
|  | import com.azure.data.cosmos.CosmosKeyCredential; | ||||||
|  | import com.baeldung.spring.data.cosmosdb.repository.ProductRepository; | ||||||
|  | import com.microsoft.azure.spring.data.cosmosdb.config.AbstractCosmosConfiguration; | ||||||
|  | import com.microsoft.azure.spring.data.cosmosdb.config.CosmosDBConfig; | ||||||
|  | import com.microsoft.azure.spring.data.cosmosdb.repository.config.EnableCosmosRepositories; | ||||||
|  | 
 | ||||||
|  | import org.springframework.beans.factory.annotation.Value; | ||||||
|  | import org.springframework.boot.SpringApplication; | ||||||
|  | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||||
|  | import org.springframework.context.annotation.Bean; | ||||||
|  | 
 | ||||||
|  | @SpringBootApplication | ||||||
|  | @EnableCosmosRepositories(basePackageClasses = ProductRepository.class) | ||||||
|  | public class AzurecosmodbApplication extends AbstractCosmosConfiguration { | ||||||
|  | 
 | ||||||
|  |     public static void main(String[] args) { | ||||||
|  |         SpringApplication.run(AzurecosmodbApplication.class, args); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Value("${azure.cosmosdb.uri}") | ||||||
|  |     private String uri; | ||||||
|  | 
 | ||||||
|  |     @Value("${azure.cosmosdb.key}") | ||||||
|  |     private String key; | ||||||
|  | 
 | ||||||
|  |     @Value("${azure.cosmosdb.secondaryKey}") | ||||||
|  |     private String secondaryKey; | ||||||
|  | 
 | ||||||
|  |     @Value("${azure.cosmosdb.database}") | ||||||
|  |     private String dbName; | ||||||
|  | 
 | ||||||
|  |     private CosmosKeyCredential cosmosKeyCredential; | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public CosmosDBConfig getConfig() { | ||||||
|  |         this.cosmosKeyCredential = new CosmosKeyCredential(key); | ||||||
|  |         CosmosDBConfig cosmosdbConfig = CosmosDBConfig.builder(uri, this.cosmosKeyCredential, dbName) | ||||||
|  |             .build(); | ||||||
|  |         return cosmosdbConfig; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,54 @@ | |||||||
|  | package com.baeldung.spring.data.cosmosdb.controller; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.spring.data.cosmosdb.entity.Product; | ||||||
|  | import com.baeldung.spring.data.cosmosdb.service.ProductService; | ||||||
|  | 
 | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.http.HttpStatus; | ||||||
|  | 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.RequestBody; | ||||||
|  | import org.springframework.web.bind.annotation.RequestMapping; | ||||||
|  | import org.springframework.web.bind.annotation.RequestParam; | ||||||
|  | import org.springframework.web.bind.annotation.ResponseStatus; | ||||||
|  | import org.springframework.web.bind.annotation.RestController; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | 
 | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/products") | ||||||
|  | public class ProductController { | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     private ProductService productService; | ||||||
|  | 
 | ||||||
|  |     @PostMapping | ||||||
|  |     @ResponseStatus(HttpStatus.CREATED) | ||||||
|  |     public void create(@RequestBody Product product) { | ||||||
|  |         productService.saveProduct(product); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @GetMapping(value = "/{id}/category/{category}") | ||||||
|  |     public Optional<Product> get(@PathVariable String id, @PathVariable String category) { | ||||||
|  |         return productService.findById(id, category); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @DeleteMapping(value = "/{id}/category/{category}") | ||||||
|  |     public void delete(@PathVariable String id, @PathVariable String category) { | ||||||
|  |         productService.delete(id, category); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @GetMapping | ||||||
|  |     public List<Product> getByName(@RequestParam String name) { | ||||||
|  |         return productService.findProductByName(name); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @GetMapping(value = "/category/{category}") | ||||||
|  |     public List<Product> getByCategory(@PathVariable String category) { | ||||||
|  |         return productService.getProductsOfCategory(category); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,58 @@ | |||||||
|  | package com.baeldung.spring.data.cosmosdb.entity; | ||||||
|  | 
 | ||||||
|  | import com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document; | ||||||
|  | import com.microsoft.azure.spring.data.cosmosdb.core.mapping.PartitionKey; | ||||||
|  | 
 | ||||||
|  | import org.springframework.data.annotation.Id; | ||||||
|  | 
 | ||||||
|  | @Document(collection = "products") | ||||||
|  | public class Product { | ||||||
|  | 
 | ||||||
|  |     @Id | ||||||
|  |     private String productid; | ||||||
|  | 
 | ||||||
|  |     private String productName; | ||||||
|  | 
 | ||||||
|  |     private double price; | ||||||
|  | 
 | ||||||
|  |     @PartitionKey | ||||||
|  |     private String productCategory; | ||||||
|  | 
 | ||||||
|  |     public String getProductid() { | ||||||
|  |         return productid; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setProductid(String productid) { | ||||||
|  |         this.productid = productid; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getProductName() { | ||||||
|  |         return productName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setProductName(String productName) { | ||||||
|  |         this.productName = productName; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getProductCategory() { | ||||||
|  |         return productCategory; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setProductCategory(String productCategory) { | ||||||
|  |         this.productCategory = productCategory; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public double getPrice() { | ||||||
|  |         return price; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setPrice(double price) { | ||||||
|  |         this.price = price; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public String toString() { | ||||||
|  |         return "Product [productid=" + productid + ", productName=" + productName + ", price=" + price + ", productCategory=" + productCategory + "]"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package com.baeldung.spring.data.cosmosdb.repository; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.spring.data.cosmosdb.entity.Product; | ||||||
|  | import com.microsoft.azure.spring.data.cosmosdb.repository.CosmosRepository; | ||||||
|  | 
 | ||||||
|  | import org.springframework.stereotype.Repository; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | @Repository | ||||||
|  | public interface ProductRepository extends CosmosRepository<Product, String> { | ||||||
|  |     List<Product> findByProductName(String productName); | ||||||
|  | 
 | ||||||
|  |     List<Product> findByProductCategory(String category); | ||||||
|  | } | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | package com.baeldung.spring.data.cosmosdb.service; | ||||||
|  | 
 | ||||||
|  | import com.azure.data.cosmos.PartitionKey; | ||||||
|  | import com.baeldung.spring.data.cosmosdb.entity.Product; | ||||||
|  | import com.baeldung.spring.data.cosmosdb.repository.ProductRepository; | ||||||
|  | 
 | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | public class ProductService { | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     private ProductRepository repository; | ||||||
|  | 
 | ||||||
|  |     public List<Product> findProductByName(String productName) { | ||||||
|  |         return repository.findByProductName(productName); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public Optional<Product> findById(String productId, String category) { | ||||||
|  |         return repository.findById(productId, new PartitionKey(category)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public List<Product> getProductsOfCategory(String category) { | ||||||
|  |         List<Product> products = repository.findByProductCategory(category); | ||||||
|  |         return products; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void saveProduct(Product product) { | ||||||
|  |         repository.save(product); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void delete(String productId, String category) { | ||||||
|  |         repository.deleteById(productId, new PartitionKey(category)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,4 @@ | |||||||
|  | azure.cosmosdb.uri=cosmodb-uri | ||||||
|  | azure.cosmosdb.key=cosmodb-primary-key | ||||||
|  | azure.cosmosdb.secondaryKey=cosmodb-second-key | ||||||
|  | azure.cosmosdb.database=cosmodb-name | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | package com.baeldung.spring.data.cosmosdb; | ||||||
|  | 
 | ||||||
|  | import com.azure.data.cosmos.PartitionKey; | ||||||
|  | import com.baeldung.spring.data.cosmosdb.entity.Product; | ||||||
|  | import com.baeldung.spring.data.cosmosdb.repository.ProductRepository; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.util.Assert; | ||||||
|  | 
 | ||||||
|  | import java.util.Optional; | ||||||
|  | 
 | ||||||
|  | //Uncomment this when configured URI and keys for Azure Cosmos DB in application.properties | ||||||
|  | //to run the integration test | ||||||
|  | //@SpringBootTest | ||||||
|  | public class AzurecosmodbApplicationIntegrationTest { | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     ProductRepository productRepository; | ||||||
|  | 
 | ||||||
|  |     // Uncomment this when configured URI and keys for Azure Cosmos DB in application.properties | ||||||
|  |     // to run the integration test | ||||||
|  |     // @Test | ||||||
|  |     public void givenProductIsCreated_whenCallFindById_thenProductIsFound() { | ||||||
|  |         Product product = new Product(); | ||||||
|  |         product.setProductid("1001"); | ||||||
|  |         product.setProductCategory("Shirt"); | ||||||
|  |         product.setPrice(110.0); | ||||||
|  |         product.setProductName("Blue Shirt"); | ||||||
|  | 
 | ||||||
|  |         // Uncomment these lines when configured URI and keys for Azure Cosmos DB in application.properties | ||||||
|  |         // to run the integration test | ||||||
|  |         // productRepository.save(product); | ||||||
|  |         // Optional<Product> retrievedProduct = productRepository.findById("1001", new PartitionKey("Shirt")); | ||||||
|  |         // Assert.notNull(retrievedProduct, "Retrieved Product is Null"); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user