Mapsruct class 和@Service class 没有@Autowired
No @Autowired for Mapsruct class as well as for @Service class
我正在尝试将 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 class(即 prodcutMapper
)没有依赖注入。
难道是Mapstruct框架负责在controller层调用自己? @Service
服务层也是如此吗?
Spring 如果 Bean 具有一个构造函数(在您的情况下由 @RequiredArgsConstructor 提供),则允许您省略 @Autowired 注释。
所以简而言之,依赖注入的发生是因为 @Autowired 效果正在发生,并且在这种情况下注释本身被省略了。
查看文档 here。
这是错误的。好吧,与其将映射器代码放入控制器,不如将其移至服务,因为控制器不应包含任何此类代码。
这样问题就解决了。 Mapper 可以放在这里但是那会被称为不好的方法。
在服务层,它会像魅力一样工作。只需执行以下操作。
@Mapper(componentModel = "spring")
public interface productMapper {...}
并在服务中 class 进行自动装配
@Autowired
private productMapper productMapper;
大功告成。
我正在尝试将 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 class(即 prodcutMapper
)没有依赖注入。
难道是Mapstruct框架负责在controller层调用自己? @Service
服务层也是如此吗?
Spring 如果 Bean 具有一个构造函数(在您的情况下由 @RequiredArgsConstructor 提供),则允许您省略 @Autowired 注释。
所以简而言之,依赖注入的发生是因为 @Autowired 效果正在发生,并且在这种情况下注释本身被省略了。
查看文档 here。
这是错误的。好吧,与其将映射器代码放入控制器,不如将其移至服务,因为控制器不应包含任何此类代码。
这样问题就解决了。 Mapper 可以放在这里但是那会被称为不好的方法。
在服务层,它会像魅力一样工作。只需执行以下操作。
@Mapper(componentModel = "spring")
public interface productMapper {...}
并在服务中 class 进行自动装配
@Autowired
private productMapper productMapper;
大功告成。