Существует ли функция автоматического размещения или подход для сущностей Spring Boot MongoDB в API реактивного сохраненJAVA

Программисты JAVA общаются здесь
Anonymous
Существует ли функция автоматического размещения или подход для сущностей Spring Boot MongoDB в API реактивного сохранен

Сообщение Anonymous »

У меня есть пружинный загрузочный микросервис, который предоставляет не блокирующие API для создания и управления объектами, называемыми продуктом . Сервисы использует MongoDB. В целях проектирования каждый продукт должен иметь числовое значение ProductId в дополнение к идентификатору полевого поля первичного ключа , которое автоматически назначается при создании нового продукта . сущности в базе данных, а затем увеличивают это число. В идеале мне бы хотелось, чтобы функция автоматического интеграмента сделает это на самой сущности, когда она сохраняется в базе данных. Любая помощь или предложения оценены < /p>
Product
package com.bh25034.products.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "products")
@ToString(callSuper = true)
public class Product {

@Id
private String id;
@Indexed(unique = true)
//TODO: this is where I’d like to have something like a GeneratedValue or auto-increment feature that’s safe from race conditions
private Long productId;
private String name;
private String description;

}

< /code>
ProductService
package com.bh25034.products.service.impl;

import com.bh25034.products.configuration.AppConfiguration;
import com.bh25034.products.event.EventType;
import com.bh25034.products.event.ProductEvent;
import com.bh25034.products.exception.NotFoundException;
import com.bh25034.products.mapping.ProductMapper;
import com.bh25034.products.messaging.ProductEventMessageProducer;
import com.bh25034.products.model.Product;
import com.bh25034.products.model.dto.ProductDto;
import com.bh25034.products.repository.ProductRepository;
import com.bh25034.products.service.ProductService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Date;

import static java.lang.String.format;

@RequiredArgsConstructor
@Slf4j
@Service
public class ProductService {

private final ProductRepository productRepository;
private final ProductMapper productMapper;

public Mono
getProduct(final String id) {
return productRepository.findById(id)
.switchIfEmpty(Mono.error(new NotFoundException(format("Could not find product %s", id))))
.map(productMapper::toProductDto);
}

public Mono getProductByProductId(final long productId) {
return productRepository.findByProductId(productId)
.switchIfEmpty(Mono.error(new NotFoundException(format("Could not find product with productId: %s", productId))))
.map(productMapper::toProductDto);
}

public Flux getAllProducts() {
return productRepository.findAll().map(productMapper::toProductDto);
}

public Mono createProduct(final ProductDto productDto) {
Product product = productMapper.toProduct(productDto);
//TODO: thought about setting the productId here but it could lead to duplicate key exceptions if another product is persisted between this line and the following save() call to the repository
return productRepository.save(product).map(savedProduct -> {
ProductDto savedProductDto = productMapper.toProductDto(savedProduct);
return savedProductDto;
});
}

public Mono deleteProduct(final String id) {
return productRepository.deleteById(id);
}

public Mono deleteProductByProductId(final long productId) {
return productRepository.findByProductId(productId)
.map(productRepository::delete)
.flatMap(voidMono -> voidMono);
}

}

< /code>
ProductDto
package com.bh25034.products.model.dto;

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

@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
public class ProductDto {

private String id;
private long productId;
private String name;
private String description;

}

< /code>
ProductMapper

package com.bh25034.products.mapping;

import com.bh25034.products.model.Product;
import com.bh25034.products.model.dto.ProductDto;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

@Mapper(componentModel = "spring")
public interface ProductMapper {

ProductDto toProductDto(Product product);

@Mappings({
@Mapping(target = "id", ignore = true)
})
Product toProduct(ProductDto productDto);

}

< /code>
ProductRepository
package com.bh25034.products.repository;

import com.bh25034.products.model.Product;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Mono;

@Repository
public interface ProductRepository extends ReactiveMongoRepository {

Mono findByProductId(long productId);

}



Подробнее здесь: https://stackoverflow.com/questions/797 ... b-entities

Вернуться в «JAVA»