Где должен происходить перевод и поиск DTO в Entity/ID в многоуровневом приложении Spring?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Где должен происходить перевод и поиск DTO в Entity/ID в многоуровневом приложении Spring?

Сообщение Anonymous »

Я создаю RESTful API с использованием Spring Boot со стандартной многоуровневой архитектурой: Контроллер (Ресурс) -> Фасад -> Сервис -> Репозиторий.
У меня есть входящий объект передачи данных (ProductRequestDto), который использует коды/естественные ключи для некоторых отношений (например, imageCodes и CountryCode). Моя внутренняя сущность Entity (Product) использует идентификаторы внешних ключей для тех же отношений (imageIds и CountryId).
Прежде чем сущность Product будет передана в ProductService для сохранения, мне необходимо:
  • Перевести/поиск естественных ключей (например, CountryCode) в идентификаторы внешних ключей (например, CountryId). Этот поиск, скорее всего, будет включать отдельный вызов репозитория/службы (например, CountryRepository.findByCode(countryCode)).
  • Сопоставьте оставшиеся свойства из ProductRequestDto с сущностью Product.
В каком слое/компоненте должна выполняться эта логика поиска и перевода находиться?
Должен ли он быть на уровне Mapper, Facade или Service?
Если бы у меня была служба проверки, которая должна была проверять и предупреждать пользователя о том, что у него конфликтующие или слишком много изображений, где бы она находилась?
Спасибо!

@Getter
@Setter
public class ProductRequestDto {
private Long id;
private String code;
private String name;
private String description;
private BigDecimal price;
private Set imageCodes; //Here as codes
private String countryCode; //Here as code
private Boolean active;
private Instant createdAt;
private Instant updatedAt;
}

@Getter
@Setter
public class Product {
private Long id;
private String code;
private String name;
private String description;
private BigDecimal price;
private Set imageIds; //Here as image ids (fk)
private Long countryId; //Here as country Id (fk)
private Boolean active;
private Instant createdAt;
private Instant updatedAt;
}

@RestController
@RequestMapping("/api")
public class ProductResource {

private final ProductFacade productFacade;

@Autowired
public ProductResource(ProductFacade productFacade) {
this.productFacade = productFacade;
}

@PostMapping("/v1/products")
public ProductResponseDto createProduct(@RequestBody CreateProductDto createProductDto){
return productFacade.createProduct(createProductDto);
}

}

@Component
public class ProductFacade {

private final ProductService productService;
private final ProductMapper productMapper;

@Autowired
public ProductFacade(ProductService productService, ProductMapper productMapper) {
this.productService = productService;
this.productMapper = productMapper;
}

public ProductResponseDto createProduct(ProductRequestDto dto) {
Product product = productMapper.toProduct(dto);
Product createdProduct = productService.createProduct(product);
return productMapper.toProductDto(createdProduct);
}

}

@Component
public class ProductService {

private final ProductRepository productRepository;

@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}

public Product createProduct(Product product) {

return productRepository.createProduct(product);
}

}


Подробнее здесь: https://stackoverflow.com/questions/798 ... layered-sp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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