Wo sollte die DTO-zu-Entitäts-/ID-Übersetzung und -Suche in einer mehrschichtigen Spring-Anwendung erfolgen? [geschlosseJava

Java-Forum
Anonymous
 Wo sollte die DTO-zu-Entitäts-/ID-Übersetzung und -Suche in einer mehrschichtigen Spring-Anwendung erfolgen? [geschlosse

Post by Anonymous »

Ich erstelle eine RESTful-API mit Spring Boot mit einer Standard-Schichtarchitektur: Controller (Ressource) -> Fassade -> Service -> Repository.
Ich habe ein eingehendes Datenübertragungsobjekt (ProductRequestDto), das Codes/natürliche Schlüssel für einige Beziehungen (wie imageCodes und CountryCode) verwendet. Meine interne Persistenzentität (Produkt) verwendet Fremdschlüssel-IDs für dieselben Beziehungen (imageIds und CountryId).
Bevor die Produktentität zur Persistenz an den ProductService übergeben wird, muss ich:
  • die natürlichen Schlüssel (z. B. CountryCode) in Fremdschlüssel-IDs (z. B. CountryId) übersetzen/nachschlagen. Diese Suche erfordert wahrscheinlich einen separaten Repository-/Dienstaufruf (z. B. countryRepository.findByCode(countryCode)).
  • Ordnen Sie die verbleibenden Eigenschaften von ProductRequestDto der Produktentität zu.
In welcher Ebene/Komponente sollte sich diese Such- und Übersetzungslogik befinden?
Sollte sie sich im Mapper befinden Fassade oder die Service-Ebene?
Wenn ich einen Validierungsdienst hätte, der den Benutzer überprüfen und darauf aufmerksam machen müsste, dass er widersprüchliche oder zu viele Bilder hat, wohin würde das gehören?
Vielen Dank!

Code: Select all

@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);
}

}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post