【问题标题】:No @Autowired for Mapsruct class as well as for @Service classMapsruct 类和 @Service 类没有 @Autowired
【发布时间】:2020-07-27 02:20:56
【问题描述】:

我正在尝试使用 MapStruct 进行 DTO 到实体(产品)的映射,反之亦然,请参阅 blog

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

在控制器中,productService(@Service) 和 productMapper(@Mapper) 看不到 @Autowired

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 框架负责在控制器层调用自己? @Service 服务层也一样吗?

【问题讨论】:

    标签: java spring dependency-injection autowired mapstruct


    【解决方案1】:

    如果 Bean 有一个构造函数(在您的情况下由 @RequiredArgsConstructor 提供),Spring 允许您省略 @Autowired 注释。

    所以简而言之,发生依赖注入是因为 @Autowired 效果正在发生,并且在这种情况下省略了注解本身。

    查看文档here

    【讨论】:

      【解决方案2】:

      这是错误。好吧,与其将映射器代码放在控制器中,不如将其移动到服务中,因为控制器不应包含任何此类代码。

      这样问题就解决了。映射器可以放在这里,但那将被称为不好的方法。

      在服务层它会像一个魅力一样工作。只需执行以下操作。

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

      在服务类中进行自动装配

      @Autowired
      private   productMapper productMapper;
      

      你已经完成了。

      【讨论】:

      • @Mapper 在控制器层是一个安全漏洞,我的假设是否正确?
      • 那是不合理的@Ayman Arif。但我们需要尊重框架,否则我们最终会造成安全漏洞。
      • 我试图将 memberId(整数)映射到成员(实体),但它失败了,我在这里读到我应该使用服务来使用他的 memberid(整数)获取成员(实体) .我的服务中的方法称为 findById(int memid),但是,在我的服务中,该方法返回一个 DTO,因为我已经在那里调用了映射,所以映射器接口需要一个成员而不是成员 DTO。我该怎么办?
      • @darioxlz in mapstruct 有一个参数expression="java(and_your_service_call_here)" 尝试使用它,或者请在您的问题中提供更清晰的说明。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      相关资源
      最近更新 更多