Spring Boot无法识别我的Mapstruct映射器。

huangapple go评论107阅读模式
英文:

Spring Boot Can't See My Mapstruct Mapper

问题

I defined the mapper but Spring Boot can't detect it. I couldn't find the problem for days. Please help. Tried on IDEA and Netbeans. Tried to add some annotations on main class from this thread.

> Description:
>
> Parameter 1 of constructor in
> com.example.springmysqlelastic.service.impl.UserService required a
> bean of type 'com.example.springmysqlelastic.mapper.UserMapper' that
> could not be found.
>
>
> Action:
>
> Consider defining a bean of type
> 'com.example.springmysqlelastic.mapper.UserMapper' in your
> configuration.

UserMapper.java

  1. package com.example.springmysqlelastic.mapper;
  2. import com.example.springmysqlelastic.model.Food;
  3. import com.example.springmysqlelastic.model.FoodModel;
  4. import com.example.springmysqlelastic.model.User;
  5. import com.example.springmysqlelastic.model.UserModel;
  6. import com.example.springmysqlelastic.model.dto.FoodDTO;
  7. import com.example.springmysqlelastic.model.dto.UserDTO;
  8. import org.mapstruct.Mapper;
  9. import org.springframework.stereotype.Component;
  10. import java.util.List;
  11. //@Component
  12. @Mapper(componentModel = "spring")
  13. public interface UserMapper {
  14. UserDTO toUserDTO(User user);
  15. List<UserDTO> toUserDtos(List<User> users);
  16. User toUser(UserDTO userDTO);
  17. List<User> toUsers(List<UserDTO> userDTOS);
  18. UserModel toUserModel(User user);
  19. /*
  20. FoodDTO toFoodDTO(Food food);
  21. List<FoodDTO> toFoodDtos(List<Food> foods);
  22. Food toFood(FoodDTO foodDTO);
  23. List<Food> toFoods(List<FoodDTO> foodDTOS);
  24. FoodModel toFoodModel(Food food);*/
  25. }

UserService.java

  1. package com.example.springmysqlelastic.service.impl;
  2. import com.example.springmysqlelastic.mapper.UserMapper;
  3. import com.example.springmysqlelastic.model.User;
  4. import com.example.springmysqlelastic.model.dto.UserDTO;
  5. import com.example.springmysqlelastic.repo.IUserDAO;
  6. import com.example.springmysqlelastic.service.IUserService;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Component;
  9. import org.springframework.stereotype.Service;
  10. import java.util.List;
  11. @Service
  12. public class UserService implements IUserService {
  13. private IUserDAO userDAO;
  14. private UserMapper userMapper;
  15. @Autowired
  16. public UserService(IUserDAO userDAO, UserMapper userMapper) {
  17. this.userDAO = userDAO;
  18. this.userMapper = userMapper;
  19. }
  20. @Override
  21. public UserDTO save(UserDTO userDTO) {
  22. User user = this.userDAO.save(this.userMapper.toUser(userDTO));
  23. return this.userMapper.toUserDTO(user);
  24. }
  25. @Override
  26. public UserDTO findById(Long id) {
  27. return this.userMapper.toUserDTO(this.userDAO.findById(id).orElse(null));
  28. }
  29. @Override
  30. public List<UserDTO> findAll() {
  31. return this.userMapper.toUserDtos(this.userDAO.findAll());
  32. }
  33. }

UserController.java

  1. package com.example.springmysqlelastic.rest;
  2. import com.example.springmysqlelastic.model.dto.UserDTO;
  3. import com.example.springmysqlelastic.service.IUserService;
  4. import com.example.springmysqlelastic.utils.PathResources;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.http.HttpStatus;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.PathVariable;
  10. import org.springframework.web.bind.annotation.PostMapping;
  11. import org.springframework.web.bind.annotation.RequestBody;
  12. import org.springframework.web.bind.annotation.RequestMapping;
  13. import org.springframework.web.bind.annotation.RestController;
  14. import java.util.List;
  15. @RestController
  16. @RequestMapping("/user") //PathResources.USER
  17. public class UserController {
  18. private final IUserService userService;
  19. @Autowired
  20. public UserController(IUserService userService) {
  21. this.userService = userService;
  22. }
  23. @PostMapping("/save") //PathResources.SAVE
  24. public ResponseEntity<UserDTO> saveUser(@RequestBody UserDTO userDTO) {
  25. return new ResponseEntity<>(this.userService.save(userDTO), HttpStatus.OK);
  26. }
  27. @GetMapping("/find-one/{id}") //PathResources.FIND_ONE + "/{" + PathResources.ID + "}"
  28. public ResponseEntity<UserDTO> findById(@PathVariable Long id) {
  29. return new ResponseEntity<>(this.userService.findById(id), HttpStatus.OK);
  30. }
  31. @GetMapping("/find-all") //PathResources.FIND_ALL
  32. public ResponseEntity<List<UserDTO>> findById() {
  33. return new ResponseEntity<>(this.userService.findAll(), HttpStatus.OK);
  34. }
  35. }

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.1.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>spring-mysql-elastic</artifactId>
  13. <packaging>jar</packaging>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>spring-mysql-elastic</name>
  16. <description>Demo project for Mysql and ElasticSearch Synchronization in Spring</description>
  17. <properties>
  18. <java.version>1.8</java.version>
  19. <mapstruct.version>1.4.0.Beta3</mapstruct.version>
  20. <org.json.version>20190722</org.json.version>
  21. <swagger.version>2.9.2</swagger.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-data-jpa</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-web</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-tomcat</artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  43. </dependency>
  44. <dependency>
  45. <groupId>mysql</groupId>
  46. <artifactId>mysql-connector-java</artifactId>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-starter-test</artifactId>
  51. <scope>test</scope>
  52. <exclusions>
  53. <
  54. <details>
  55. <summary>英文:</summary>
  56. I defined the mapper but Spring Boot can&#39;t detect it. I couldn&#39;t find the problem for days. Please help. Tried on IDEA and Netbeans. Tried to add some annotations on main class from [this thread][1].
  57. &gt; *Description:*
  58. &gt;
  59. &gt; Parameter 1 of constructor in
  60. &gt; com.example.springmysqlelastic.service.impl.UserService required a
  61. &gt; bean of type &#39;com.example.springmysqlelastic.mapper.UserMapper&#39; that
  62. &gt; could not be found.
  63. &gt;
  64. &gt;
  65. &gt; *Action:*
  66. &gt;
  67. &gt; **Consider defining a bean of type
  68. &gt; &#39;com.example.springmysqlelastic.mapper.UserMapper&#39; in your
  69. &gt; configuration.**
  70. **UserMapper.java**
  71. package com.example.springmysqlelastic.mapper;
  72. import com.example.springmysqlelastic.model.Food;
  73. import com.example.springmysqlelastic.model.FoodModel;
  74. import com.example.springmysqlelastic.model.User;
  75. import com.example.springmysqlelastic.model.UserModel;
  76. import com.example.springmysqlelastic.model.dto.FoodDTO;
  77. import com.example.springmysqlelastic.model.dto.UserDTO;
  78. import org.mapstruct.Mapper;
  79. import org.springframework.stereotype.Component;
  80. import java.util.List;
  81. //@Component
  82. @Mapper(componentModel = &quot;spring&quot;)
  83. public interface UserMapper {
  84. UserDTO toUserDTO(User user);
  85. List&lt;UserDTO&gt; toUserDtos(List&lt;User&gt; users);
  86. User toUser(UserDTO userDTO);
  87. List&lt;User&gt; toUsers(List&lt;UserDTO&gt; userDTOS);
  88. UserModel toUserModel(User user);
  89. /*
  90. FoodDTO toFoodDTO(Food food);
  91. List&lt;FoodDTO&gt; toFoodDtos(List&lt;Food&gt; foods);
  92. Food toFood(FoodDTO foodDTO);
  93. List&lt;Food&gt; toFoods(List&lt;FoodDTO&gt; foodDTOS);
  94. FoodModel toFoodModel(Food food);*/
  95. }
  96. **UserService**
  97. package com.example.springmysqlelastic.service.impl;
  98. import com.example.springmysqlelastic.mapper.UserMapper;
  99. import com.example.springmysqlelastic.model.User;
  100. import com.example.springmysqlelastic.model.dto.UserDTO;
  101. import com.example.springmysqlelastic.repo.IUserDAO;
  102. import com.example.springmysqlelastic.service.IUserService;
  103. import org.springframework.beans.factory.annotation.Autowired;
  104. import org.springframework.stereotype.Component;
  105. import org.springframework.stereotype.Service;
  106. import java.util.List;
  107. @Service
  108. public class UserService implements IUserService {
  109. private IUserDAO userDAO;
  110. private UserMapper userMapper;
  111. @Autowired
  112. public UserService(IUserDAO userDAO, UserMapper userMapper) {
  113. this.userDAO = userDAO;
  114. this.userMapper = userMapper;
  115. }
  116. @Override
  117. public UserDTO save(UserDTO userDTO) {
  118. User user = this.userDAO.save(this.userMapper.toUser(userDTO));
  119. return this.userMapper.toUserDTO(user);
  120. }
  121. @Override
  122. public UserDTO findById(Long id) {
  123. return this.userMapper.toUserDTO(this.userDAO.findById(id).orElse(null));
  124. }
  125. @Override
  126. public List&lt;UserDTO&gt; findAll() {
  127. return this.userMapper.toUserDtos(this.userDAO.findAll());
  128. }
  129. }
  130. **UserController.java**
  131. package com.example.springmysqlelastic.rest;
  132. import com.example.springmysqlelastic.model.dto.UserDTO;
  133. import com.example.springmysqlelastic.service.IUserService;
  134. import com.example.springmysqlelastic.utils.PathResources;
  135. import org.springframework.beans.factory.annotation.Autowired;
  136. import org.springframework.http.HttpStatus;
  137. import org.springframework.http.ResponseEntity;
  138. import org.springframework.web.bind.annotation.GetMapping;
  139. import org.springframework.web.bind.annotation.PathVariable;
  140. import org.springframework.web.bind.annotation.PostMapping;
  141. import org.springframework.web.bind.annotation.RequestBody;
  142. import org.springframework.web.bind.annotation.RequestMapping;
  143. import org.springframework.web.bind.annotation.RestController;
  144. import java.util.List;
  145. @RestController
  146. @RequestMapping(&quot;/user&quot;) //PathResources.USER
  147. public class UserController {
  148. private final IUserService userService;
  149. @Autowired
  150. public UserController(IUserService userService) {
  151. this.userService = userService;
  152. }
  153. @PostMapping(&quot;/save&quot;) //PathResources.SAVE
  154. public ResponseEntity&lt;UserDTO&gt; saveUser(@RequestBody UserDTO userDTO) {
  155. return new ResponseEntity&lt;&gt;(this.userService.save(userDTO), HttpStatus.OK);
  156. }
  157. @GetMapping(&quot;/find-one/{id}&quot;) //PathResources.FIND_ONE + &quot;/{&quot; + PathResources.ID + &quot;}&quot;
  158. public ResponseEntity&lt;UserDTO&gt; findById(@PathVariable Long id) {
  159. return new ResponseEntity&lt;&gt;(this.userService.findById(id), HttpStatus.OK);
  160. }
  161. @GetMapping(&quot;/find-all&quot;) //PathResources.FIND_ALL
  162. public ResponseEntity&lt;List&lt;UserDTO&gt;&gt; findById() {
  163. return new ResponseEntity&lt;&gt;(this.userService.findAll(), HttpStatus.OK);
  164. }
  165. }
  166. **pom.xml**
  167. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  168. &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  169. xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  170. &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  171. &lt;parent&gt;
  172. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  173. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  174. &lt;version&gt;2.3.1.RELEASE&lt;/version&gt;
  175. &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;
  176. &lt;/parent&gt;
  177. &lt;groupId&gt;com.example&lt;/groupId&gt;
  178. &lt;artifactId&gt;spring-mysql-elastic&lt;/artifactId&gt;
  179. &lt;packaging&gt;jar&lt;/packaging&gt;
  180. &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
  181. &lt;name&gt;spring-mysql-elastic&lt;/name&gt;
  182. &lt;description&gt;Demo project for Mysql and ElasticSearch Synchronization in Spring&lt;/description&gt;
  183. &lt;properties&gt;
  184. &lt;java.version&gt;1.8&lt;/java.version&gt;
  185. &lt;mapstruct.version&gt;1.4.0.Beta3&lt;/mapstruct.version&gt;
  186. &lt;org.json.version&gt;20190722&lt;/org.json.version&gt;
  187. &lt;swagger.version&gt;2.9.2&lt;/swagger.version&gt;
  188. &lt;/properties&gt;
  189. &lt;dependencies&gt;
  190. &lt;dependency&gt;
  191. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  192. &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;
  193. &lt;/dependency&gt;
  194. &lt;dependency&gt;
  195. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  196. &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
  197. &lt;/dependency&gt;
  198. &lt;dependency&gt;
  199. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  200. &lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt;
  201. &lt;/dependency&gt;
  202. &lt;dependency&gt;
  203. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  204. &lt;artifactId&gt;spring-boot-starter-data-elasticsearch&lt;/artifactId&gt;
  205. &lt;/dependency&gt;
  206. &lt;dependency&gt;
  207. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  208. &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt;
  209. &lt;/dependency&gt;
  210. &lt;dependency&gt;
  211. &lt;groupId&gt;mysql&lt;/groupId&gt;
  212. &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
  213. &lt;/dependency&gt;
  214. &lt;dependency&gt;
  215. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  216. &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
  217. &lt;scope&gt;test&lt;/scope&gt;
  218. &lt;exclusions&gt;
  219. &lt;exclusion&gt;
  220. &lt;groupId&gt;org.junit.vintage&lt;/groupId&gt;
  221. &lt;artifactId&gt;junit-vintage-engine&lt;/artifactId&gt;
  222. &lt;/exclusion&gt;
  223. &lt;/exclusions&gt;
  224. &lt;/dependency&gt;
  225. &lt;dependency&gt;
  226. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  227. &lt;artifactId&gt;mapstruct-jdk8&lt;/artifactId&gt;
  228. &lt;version&gt;${mapstruct.version}&lt;/version&gt;
  229. &lt;/dependency&gt;
  230. &lt;!-- https://mvnrepository.com/artifact/org.json/json --&gt;
  231. &lt;dependency&gt;
  232. &lt;groupId&gt;org.json&lt;/groupId&gt;
  233. &lt;artifactId&gt;json&lt;/artifactId&gt;
  234. &lt;version&gt;${org.json.version}&lt;/version&gt;
  235. &lt;/dependency&gt;
  236. &lt;!-- https://mvnrepository.com/artifact/com.alibaba/fastjson
  237. &lt;dependency&gt;
  238. &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
  239. &lt;artifactId&gt;fastjson&lt;/artifactId&gt;
  240. &lt;version&gt;1.2.73&lt;/version&gt;
  241. &lt;/dependency&gt;--&gt;
  242. &lt;dependency&gt;
  243. &lt;groupId&gt;io.springfox&lt;/groupId&gt;
  244. &lt;artifactId&gt;springfox-swagger2&lt;/artifactId&gt;
  245. &lt;version&gt;${swagger.version}&lt;/version&gt;
  246. &lt;/dependency&gt;
  247. &lt;dependency&gt;
  248. &lt;groupId&gt;io.springfox&lt;/groupId&gt;
  249. &lt;artifactId&gt;springfox-swagger-ui&lt;/artifactId&gt;
  250. &lt;version&gt;${swagger.version}&lt;/version&gt;
  251. &lt;/dependency&gt;
  252. &lt;dependency&gt;
  253. &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
  254. &lt;artifactId&gt;lombok&lt;/artifactId&gt;
  255. &lt;!--&lt;version&gt;1.18.12&lt;/version&gt;--&gt;
  256. &lt;type&gt;jar&lt;/type&gt;
  257. &lt;/dependency&gt;
  258. &lt;!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --&gt;
  259. &lt;dependency&gt;
  260. &lt;groupId&gt;com.google.code.gson&lt;/groupId&gt;
  261. &lt;artifactId&gt;gson&lt;/artifactId&gt;
  262. &lt;version&gt;2.8.6&lt;/version&gt;
  263. &lt;/dependency&gt;
  264. &lt;dependency&gt;
  265. &lt;groupId&gt;jakarta.validation&lt;/groupId&gt;
  266. &lt;artifactId&gt;jakarta.validation-api&lt;/artifactId&gt;
  267. &lt;version&gt;2.0.2&lt;/version&gt;
  268. &lt;type&gt;jar&lt;/type&gt;
  269. &lt;/dependency&gt;
  270. &lt;/dependencies&gt;
  271. &lt;build&gt;
  272. &lt;plugins&gt;
  273. &lt;plugin&gt;
  274. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  275. &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
  276. &lt;executions&gt;
  277. &lt;execution&gt;
  278. &lt;goals&gt;
  279. &lt;goal&gt;repackage&lt;/goal&gt;
  280. &lt;/goals&gt;
  281. &lt;configuration&gt;
  282. &lt;mainClass&gt;com.example.springmysqlelastic.SpringMysqlElasticApplication&lt;/mainClass&gt;
  283. &lt;/configuration&gt;
  284. &lt;/execution&gt;
  285. &lt;/executions&gt;
  286. &lt;/plugin&gt;
  287. &lt;plugin&gt;
  288. &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
  289. &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
  290. &lt;configuration&gt;
  291. &lt;source&gt;${java.version}&lt;/source&gt;
  292. &lt;target&gt;${java.version}&lt;/target&gt;
  293. &lt;annotationProcessorPaths&gt;
  294. &lt;path&gt;
  295. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  296. &lt;artifactId&gt;mapstruct-processor&lt;/artifactId&gt;
  297. &lt;version&gt;${mapstruct.version}&lt;/version&gt;
  298. &lt;/path&gt;
  299. &lt;/annotationProcessorPaths&gt;
  300. &lt;/configuration&gt;
  301. &lt;/plugin&gt;
  302. &lt;/plugins&gt;
  303. &lt;/build&gt;
  304. &lt;/project&gt;
  305. **Main class**
  306. package com.example.springmysqlelastic;
  307. import org.springframework.boot.SpringApplication;
  308. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  309. import org.springframework.boot.autoconfigure.SpringBootApplication;
  310. import org.springframework.boot.autoconfigure.domain.EntityScan;
  311. import org.springframework.context.annotation.ComponentScan;
  312. import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
  313. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  314. import org.springframework.scheduling.annotation.EnableScheduling;
  315. @SpringBootApplication
  316. //@SpringBootApplication(scanBasePackages={&quot;com.example.springmysqlelastic&quot;})
  317. @EnableElasticsearchRepositories(&quot;com.example.springmysqlelastic.repo.elastic&quot;)
  318. @EnableScheduling
  319. //@ComponentScan(scanBasePackages = {&quot;com.example.springmysqlelastic&quot;})
  320. //@EntityScan(&quot;com.example.springmysqlelastic.model&quot;)
  321. //@EnableJpaRepositories(&quot;com.example.springmysqlelastic&quot;)
  322. //@ComponentScan(basePackages = {&quot;com.example.springmysqlelastic&quot;})
  323. //@EnableAutoConfiguration
  324. public class SpringMysqlElasticApplication {
  325. public static void main(String[] args) {
  326. SpringApplication.run(SpringMysqlElasticApplication.class, args);
  327. }
  328. }
  329. [1]: https://stackoverflow.com/questions/40384056/consider-defining-a-bean-of-type-package-in-your-configuration-spring-boot
  330. </details>
  331. # 答案1
  332. **得分**: 1
  333. 在[文档][1]中提到,除了主要的依赖项外,您还需要添加annotationProcessor。
  334. Gradle示例:
  335. ```gradle
  336. dependencies {
  337. implementation 'org.mapstruct:mapstruct:1.4.2.Final'
  338. annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
  339. }
英文:

In the documentation says that in addition to the main dependency, you need to add annotationProcessor

Example for Gradle:

  1. dependencies {
  2. implementation &#39;org.mapstruct:mapstruct:1.4.2.Final&#39;
  3. annotationProcessor &#39;org.mapstruct:mapstruct-processor:1.4.2.Final&#39;
  4. }

答案2

得分: 0

我认为这是与Swagger与Mapstruct库冲突的问题。

我修改了您的POM文件如下所示,并且对我起作用。这里有一些关于它的文档:https://www.programmersought.com/article/6208308983/

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.1.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>spring-mysql-elastic</artifactId>
  13. <packaging>jar</packaging>
  14. <version>0.0.1-SNAPSHOT</version>
  15. <name>spring-mysql-elastic</name>
  16. <description>Demo project for Mysql and ElasticSearch Synchronization in Spring</description>
  17. <properties>
  18. <java.version>1.8</java.version>
  19. <mapstruct.version>1.4.0.Beta3</mapstruct.version>
  20. <org.json.version>20190722</org.json.version>
  21. <swagger.version>2.9.2</swagger.version>
  22. </properties>
  23. <dependencies>
  24. <!-- 其他依赖 -->
  25. <!-- 修改Swagger依赖如下 -->
  26. <dependency>
  27. <groupId>io.springfox</groupId>
  28. <artifactId>springfox-swagger2</artifactId>
  29. <version>${swagger.version}</version>
  30. <exclusions>
  31. <exclusion>
  32. <groupId>org.mapstruct</groupId>
  33. <artifactId>mapstruct</artifactId>
  34. </exclusion>
  35. </exclusions>
  36. </dependency>
  37. <dependency>
  38. <groupId>io.springfox</groupId>
  39. <artifactId>springfox-swagger-ui</artifactId>
  40. <version>${swagger.version}</version>
  41. <exclusions>
  42. <exclusion>
  43. <groupId>org.mapstruct</groupId>
  44. <artifactId>mapstruct</artifactId>
  45. </exclusion>
  46. </exclusions>
  47. </dependency>
  48. <!-- 其他依赖 -->
  49. </dependencies>
  50. <!-- 其他配置 -->
  51. </project>

您可以检查它是否适用于您。

更新
在代码生成步骤之后,它生成了以下内容:

  1. package com.example.springmysqlelastic.mapper;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.annotation.Generated;
  5. import org.springframework.stereotype.Component;
  6. @Generated(
  7. value = "org.mapstruct.ap.MappingProcessor",
  8. date = "2020-08-11T16:40:57+0530",
  9. comments = "version: 1.4.0.Beta3, compiler: javac, environment: Java 1.8.0_265 (Private Build)"
  10. )
  11. @Component
  12. public class UserMapperImpl implements UserMapper {
  13. @Override
  14. public UserDTO toUserDTO(User user) {
  15. if ( user == null ) {
  16. return null;
  17. }
  18. UserDTO userDTO = new UserDTO();
  19. return userDTO;
  20. }
  21. @Override
  22. public List<UserDTO> toUserDtos(List<User> users) {
  23. if ( users == null ) {
  24. return null;
  25. }
  26. List<UserDTO> list = new ArrayList<UserDTO>( users.size() );
  27. for ( User user : users ) {
  28. list.add( toUserDTO( user ) );
  29. }
  30. return list;
  31. }
  32. @Override
  33. public User toUser(UserDTO userDTO) {
  34. if ( userDTO == null ) {
  35. return null;
  36. }
  37. User user = new User();
  38. return user;
  39. }
  40. @Override
  41. public List<User> toUsers(List<UserDTO> userDTOS) {
  42. if ( userDTOS == null ) {
  43. return null;
  44. }
  45. List<User> list = new ArrayList<User>( userDTOS.size() );
  46. for ( UserDTO userDTO : userDTOS ) {
  47. list.add( toUser( userDTO ) );
  48. }
  49. return list;
  50. }
  51. }

希望这对您有所帮助。

英文:

I think its an issue with swagger conflicting with the mapstruct library..

I modified your POM like below and it started working for me. They have some documentation here that talks about it. https://www.programmersought.com/article/6208308983/

  1. &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  2. &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  3. xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  4. &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  5. &lt;parent&gt;
  6. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  7. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  8. &lt;version&gt;2.3.1.RELEASE&lt;/version&gt;
  9. &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;
  10. &lt;/parent&gt;
  11. &lt;groupId&gt;com.example&lt;/groupId&gt;
  12. &lt;artifactId&gt;spring-mysql-elastic&lt;/artifactId&gt;
  13. &lt;packaging&gt;jar&lt;/packaging&gt;
  14. &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
  15. &lt;name&gt;spring-mysql-elastic&lt;/name&gt;
  16. &lt;description&gt;Demo project for Mysql and ElasticSearch Synchronization in Spring&lt;/description&gt;
  17. &lt;properties&gt;
  18. &lt;java.version&gt;1.8&lt;/java.version&gt;
  19. &lt;mapstruct.version&gt;1.4.0.Beta3&lt;/mapstruct.version&gt;
  20. &lt;org.json.version&gt;20190722&lt;/org.json.version&gt;
  21. &lt;swagger.version&gt;2.9.2&lt;/swagger.version&gt;
  22. &lt;/properties&gt;
  23. &lt;dependencies&gt;
  24. &lt;dependency&gt;
  25. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  26. &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
  27. &lt;/dependency&gt;
  28. &lt;dependency&gt;
  29. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  30. &lt;artifactId&gt;spring-boot-starter-tomcat&lt;/artifactId&gt;
  31. &lt;/dependency&gt;
  32. &lt;dependency&gt;
  33. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  34. &lt;artifactId&gt;spring-boot-starter-data-elasticsearch&lt;/artifactId&gt;
  35. &lt;/dependency&gt;
  36. &lt;dependency&gt;
  37. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  38. &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt;
  39. &lt;/dependency&gt;
  40. &lt;dependency&gt;
  41. &lt;groupId&gt;mysql&lt;/groupId&gt;
  42. &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
  43. &lt;/dependency&gt;
  44. &lt;dependency&gt;
  45. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  46. &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
  47. &lt;scope&gt;test&lt;/scope&gt;
  48. &lt;exclusions&gt;
  49. &lt;exclusion&gt;
  50. &lt;groupId&gt;org.junit.vintage&lt;/groupId&gt;
  51. &lt;artifactId&gt;junit-vintage-engine&lt;/artifactId&gt;
  52. &lt;/exclusion&gt;
  53. &lt;/exclusions&gt;
  54. &lt;/dependency&gt;
  55. &lt;dependency&gt;
  56. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  57. &lt;artifactId&gt;mapstruct-jdk8&lt;/artifactId&gt;
  58. &lt;version&gt;${mapstruct.version}&lt;/version&gt;
  59. &lt;/dependency&gt;
  60. &lt;!-- https://mvnrepository.com/artifact/org.json/json --&gt;
  61. &lt;dependency&gt;
  62. &lt;groupId&gt;org.json&lt;/groupId&gt;
  63. &lt;artifactId&gt;json&lt;/artifactId&gt;
  64. &lt;version&gt;${org.json.version}&lt;/version&gt;
  65. &lt;/dependency&gt;
  66. &lt;!-- https://mvnrepository.com/artifact/com.alibaba/fastjson
  67. &lt;dependency&gt;
  68. &lt;groupId&gt;com.alibaba&lt;/groupId&gt;
  69. &lt;artifactId&gt;fastjson&lt;/artifactId&gt;
  70. &lt;version&gt;1.2.73&lt;/version&gt;
  71. &lt;/dependency&gt;--&gt;
  72. &lt;dependency&gt;
  73. &lt;groupId&gt;io.springfox&lt;/groupId&gt;
  74. &lt;artifactId&gt;springfox-swagger2&lt;/artifactId&gt;
  75. &lt;version&gt;${swagger.version}&lt;/version&gt;
  76. &lt;exclusions&gt;
  77. &lt;exclusion&gt;
  78. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  79. &lt;artifactId&gt;mapstruct&lt;/artifactId&gt;
  80. &lt;/exclusion&gt;
  81. &lt;/exclusions&gt;
  82. &lt;/dependency&gt;
  83. &lt;dependency&gt;
  84. &lt;groupId&gt;io.springfox&lt;/groupId&gt;
  85. &lt;artifactId&gt;springfox-swagger-ui&lt;/artifactId&gt;
  86. &lt;version&gt;${swagger.version}&lt;/version&gt;
  87. &lt;exclusions&gt;
  88. &lt;exclusion&gt;
  89. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  90. &lt;artifactId&gt;mapstruct&lt;/artifactId&gt;
  91. &lt;/exclusion&gt;
  92. &lt;/exclusions&gt;
  93. &lt;/dependency&gt;
  94. &lt;dependency&gt;
  95. &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
  96. &lt;artifactId&gt;lombok&lt;/artifactId&gt;
  97. &lt;!--&lt;version&gt;1.18.12&lt;/version&gt;--&gt;
  98. &lt;type&gt;jar&lt;/type&gt;
  99. &lt;/dependency&gt;
  100. &lt;!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --&gt;
  101. &lt;dependency&gt;
  102. &lt;groupId&gt;com.google.code.gson&lt;/groupId&gt;
  103. &lt;artifactId&gt;gson&lt;/artifactId&gt;
  104. &lt;version&gt;2.8.6&lt;/version&gt;
  105. &lt;/dependency&gt;
  106. &lt;dependency&gt;
  107. &lt;groupId&gt;jakarta.validation&lt;/groupId&gt;
  108. &lt;artifactId&gt;jakarta.validation-api&lt;/artifactId&gt;
  109. &lt;version&gt;2.0.2&lt;/version&gt;
  110. &lt;type&gt;jar&lt;/type&gt;
  111. &lt;/dependency&gt;
  112. &lt;dependency&gt;
  113. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  114. &lt;artifactId&gt;mapstruct&lt;/artifactId&gt;
  115. &lt;version&gt;1.4.0.Beta3&lt;/version&gt;
  116. &lt;/dependency&gt;
  117. &lt;/dependencies&gt;
  118. &lt;build&gt;
  119. &lt;plugins&gt;
  120. &lt;plugin&gt;
  121. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  122. &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
  123. &lt;executions&gt;
  124. &lt;execution&gt;
  125. &lt;goals&gt;
  126. &lt;goal&gt;repackage&lt;/goal&gt;
  127. &lt;/goals&gt;
  128. &lt;configuration&gt;
  129. &lt;mainClass&gt;com.example.springmysqlelastic.SpringMysqlElasticApplication&lt;/mainClass&gt;
  130. &lt;/configuration&gt;
  131. &lt;/execution&gt;
  132. &lt;/executions&gt;
  133. &lt;/plugin&gt;
  134. &lt;plugin&gt;
  135. &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
  136. &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
  137. &lt;configuration&gt;
  138. &lt;source&gt;${java.version}&lt;/source&gt;
  139. &lt;target&gt;${java.version}&lt;/target&gt;
  140. &lt;annotationProcessorPaths&gt;
  141. &lt;path&gt;
  142. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  143. &lt;artifactId&gt;mapstruct-processor&lt;/artifactId&gt;
  144. &lt;version&gt;1.4.0.Beta3&lt;/version&gt;
  145. &lt;/path&gt;
  146. &lt;/annotationProcessorPaths&gt;
  147. &lt;/configuration&gt;
  148. &lt;/plugin&gt;
  149. &lt;/plugins&gt;
  150. &lt;/build&gt;
  151. &lt;/project&gt;

PS: I have removed JPA dependency to make it work without spring. Forget it.

You can find that I have changed swagger dependencies to look like below -

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;io.springfox&lt;/groupId&gt;
  3. &lt;artifactId&gt;springfox-swagger2&lt;/artifactId&gt;
  4. &lt;version&gt;${swagger.version}&lt;/version&gt;
  5. &lt;exclusions&gt;
  6. &lt;exclusion&gt;
  7. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  8. &lt;artifactId&gt;mapstruct&lt;/artifactId&gt;
  9. &lt;/exclusion&gt;
  10. &lt;/exclusions&gt;
  11. &lt;/dependency&gt;
  12. &lt;dependency&gt;
  13. &lt;groupId&gt;io.springfox&lt;/groupId&gt;
  14. &lt;artifactId&gt;springfox-swagger-ui&lt;/artifactId&gt;
  15. &lt;version&gt;${swagger.version}&lt;/version&gt;
  16. &lt;exclusions&gt;
  17. &lt;exclusion&gt;
  18. &lt;groupId&gt;org.mapstruct&lt;/groupId&gt;
  19. &lt;artifactId&gt;mapstruct&lt;/artifactId&gt;
  20. &lt;/exclusion&gt;
  21. &lt;/exclusions&gt;
  22. &lt;/dependency&gt;

Can you check if it works for you?

Update
After codegen step, this is what it generates -

  1. package com.example.springmysqlelastic.mapper;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.annotation.Generated;
  5. import org.springframework.stereotype.Component;
  6. @Generated(
  7. value = &quot;org.mapstruct.ap.MappingProcessor&quot;,
  8. date = &quot;2020-08-11T16:40:57+0530&quot;,
  9. comments = &quot;version: 1.4.0.Beta3, compiler: javac, environment: Java 1.8.0_265 (Private Build)&quot;
  10. )
  11. @Component
  12. public class UserMapperImpl implements UserMapper {
  13. @Override
  14. public UserDTO toUserDTO(User user) {
  15. if ( user == null ) {
  16. return null;
  17. }
  18. UserDTO userDTO = new UserDTO();
  19. return userDTO;
  20. }
  21. @Override
  22. public List&lt;UserDTO&gt; toUserDtos(List&lt;User&gt; users) {
  23. if ( users == null ) {
  24. return null;
  25. }
  26. List&lt;UserDTO&gt; list = new ArrayList&lt;UserDTO&gt;( users.size() );
  27. for ( User user : users ) {
  28. list.add( toUserDTO( user ) );
  29. }
  30. return list;
  31. }
  32. @Override
  33. public User toUser(UserDTO userDTO) {
  34. if ( userDTO == null ) {
  35. return null;
  36. }
  37. User user = new User();
  38. return user;
  39. }
  40. @Override
  41. public List&lt;User&gt; toUsers(List&lt;UserDTO&gt; userDTOS) {
  42. if ( userDTOS == null ) {
  43. return null;
  44. }
  45. List&lt;User&gt; list = new ArrayList&lt;User&gt;( userDTOS.size() );
  46. for ( UserDTO userDTO : userDTOS ) {
  47. list.add( toUser( userDTO ) );
  48. }
  49. return list;
  50. }
  51. }

huangapple
  • 本文由 发表于 2020年8月11日 16:56:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/63354852.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定