Нет @Autowired для класса Mapsruct, а также для класса @Service - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь использовать MapStruct для отображения DTO на сущность (продукт) и наоборот, ссылаясь на этот блог .

├── product
   ├── Product.java
   ├── ProductAPI.java
   ├── ProductDTO.java
   ├── ProductMapper.java
   ├── ProductRespository.java
   └── ProductService.java

В контроллере я не вижу @Autowired для productService (@ Service) и productMapper (@ Mapper).

import java.util.List;
import java.util.Optional;


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RequiredArgsConstructor

@RestController
@RequestMapping("/products")
public class ProductAPI {
    private final ProductService productService;
    private final ProductMapper productMapper;

    @GetMapping
    public ResponseEntity<List<ProductDTO>> findAll() {
        return ResponseEntity.ok(productMapper.toProductDTOs(productService.findAll()));
    }

    @PostMapping
    public ResponseEntity<ProductDTO> create(@RequestBody ProductDTO productDTO) {
        productService.save(productMapper.toProduct(productDTO));

        return ResponseEntity.status(HttpStatus.CREATED).body(productDTO);
    }
}

Я хотел бы знать, почему не было бы внедрения зависимостей для класса MapStruct (то есть prodcutMapper).

Это потому, что инфраструктура Mapstruct отвечает за вызов себя на уровне контроллера? То же самое go для @Service уровня обслуживания?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Spring позволяет вам опустить аннотацию @Autowired, если у Бина есть один конструктор (предоставляемый в вашем случае @RequiredArgsConstructor).

Короче говоря, внедрение зависимости происходит потому, что эффект @Autowired происходит, и сама аннотация в этом случае опускается.

Проверьте документы здесь .

0 голосов
/ 14 апреля 2020

Это НЕПРАВИЛЬНО . Что ж, вместо того, чтобы помещать код сопоставления в контроллер, вы должны переместить его в Service, поскольку контроллер не должен содержать такой код.

Таким образом, проблема будет устранена. Картограф может быть размещен здесь, но это будет называться плохим подходом.

На уровне сервиса он будет работать как шарм. Просто сделайте следующее.

@Mapper(componentModel = "spring")
public interface productMapper {...}

А в классе обслуживания сделайте автопроводку

@Autowired
private   productMapper productMapper;

Все готово.

...