Mapstruct-generated class not inserted by Spring in JHipster web application

I am developing a web application built using JHipster v2.20.0. Using Eclipse 4.5.0 WTP as a development environment.

Spring configuration is based on annotation.

I just combined this pull with our code.

When I try to run the application inside Eclipse, I get this exception:

[INFO] com.app.tenancy.hibernate.MyCurrentTenantIdentifierResolver - MyCurrentTenantIdentifierResolver.getTenantId(): Couldn't find Company/Tenant for the domain inventario, stopping serving the request [WARN] org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userManagementResource': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.app.web.rest.mapper.UserManagementMapper com.app.web.rest.UserManagementResource.userManagementMapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.app.web.rest.mapper.UserManagementMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) ~[spring-context-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) ~[spring-context-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) [spring-boot-1.2.5.RELEASE.jar:1.2.5.RELEASE] at com.app.Application.main(Application.java:79) [classes/:na] Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.app.web.rest.mapper.UserManagementMapper com.app.web.rest.UserManagementResource.userManagementMapper; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.app.web.rest.mapper.UserManagementMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] ... 14 common frames omitted Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.app.web.rest.mapper.UserManagementMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) ~[spring-beans-4.1.7.RELEASE.jar:4.1.7.RELEASE] ... 16 common frames omitted 

This is the UserManagementMapper class:

 package com.app.web.rest.mapper; import java.util.List; import java.util.Optional; import javax.inject.Inject; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; import com.app.domain.User; import com.app.service.UserService; import com.app.web.rest.dto.UserManagementDTO; @Mapper(componentModel = "spring", uses = {}) public abstract class UserManagementMapper { @Inject private UserService userService; public abstract UserManagementDTO userToUserManagementDTO(User user); public abstract List<UserManagementDTO> usersToUserManagementsDTO(List<User> users); @Mapping(target = "createdBy", ignore=true) @Mapping(target = "createdDate", ignore=true) @Mapping(target = "lastModifiedBy", ignore=true) @Mapping(target = "lastModifiedDate", ignore=true) @Mapping(target = "persistentTokens", ignore=true) @Mapping(target = "resetDate", ignore=true) @Mapping(target = "activationKey", ignore=true) @Mapping(target = "resetKey", ignore=true) @Mapping(target = "password", ignore=true) public abstract User updateUserFromDto(UserManagementDTO userManagementDTO, @MappingTarget User user); public User userManagementDTOToUser(UserManagementDTO userManagementDTO) { return Optional.ofNullable(userService.getUserWithAuthorities(userManagementDTO.getId())) .map(user -> this.updateUserFromDto(userManagementDTO, user)) .orElse(null); } } 

This is the UserManagementResource class:

 package com.app.web.rest; import java.net.URISyntaxException; import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import javax.annotation.security.RolesAllowed; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.codahale.metrics.annotation.Timed; import com.app.domain.User; import com.app.repository.UserRepository; import com.app.security.AuthoritiesConstants; import com.app.service.UserService; import com.app.web.rest.dto.UserManagementDTO; import com.app.web.rest.mapper.UserManagementMapper; import com.app.web.rest.util.PaginationUtil; /** * REST controller for managing users. */ @RestController @RequestMapping("/api") public class UserManagementResource { private final Logger log = LoggerFactory.getLogger(UserManagementResource.class); @Inject private UserService userService; @Inject private UserRepository userRepository; @Autowired private UserManagementMapper userManagementMapper; /** * GET /userManagement -> get all users to manage. */ @RequestMapping(value = "/userManagement", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @Timed @RolesAllowed(AuthoritiesConstants.ADMIN) @Transactional(readOnly = true) public ResponseEntity<List<UserManagementDTO>> getAll(@RequestParam(value = "page" , required = false) Integer offset, @RequestParam(value = "per_page", required = false) Integer limit) throws URISyntaxException { Page<User> page = userRepository.findAll(PaginationUtil.generatePageRequest(offset, limit)); HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/userManagement", offset, limit); return new ResponseEntity<>(page.getContent().stream() .map(userManagementMapper::userToUserManagementDTO) .collect(Collectors.toCollection(LinkedList::new)), headers, HttpStatus.OK); } /** * GET /userManagement/:id -> get id user to manage. */ @RequestMapping(value = "/userManagement/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @Timed @RolesAllowed(AuthoritiesConstants.ADMIN) @Transactional(readOnly = true) ResponseEntity<UserManagementDTO> getUser(@PathVariable Long id) { log.debug("REST request to get User to manage : {}", id); return Optional.ofNullable(userService.getUserWithAuthorities(id)) .map(userManagementMapper::userToUserManagementDTO) .map(userManagementDTO -> new ResponseEntity<>( userManagementDTO, HttpStatus.OK)) .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); } /** * PUT /userManagement -> Updates an existing user. */ @RequestMapping(value = "/userManagement", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE) @Timed @RolesAllowed(AuthoritiesConstants.ADMIN) public ResponseEntity<Void> update(@RequestBody UserManagementDTO userManagementDTO) throws URISyntaxException { log.debug("REST request to update User : {}", userManagementDTO); if (userManagementDTO.getId() == null) { return ResponseEntity.badRequest().header("Failure", "You cannot create a new user").build(); } User user = userManagementMapper.userManagementDTOToUser(userManagementDTO); userRepository.save(user); return ResponseEntity.ok().build(); } } 

Finally, the pom.xml file was not modified during this merge. The application worked successfully before the merge.

This is probably a newbie question, but I have lost more hours trying to solve this than to perform a merge.

Thanks in advance for your help!

+6
source share
3 answers

You need to make sure that the “target / generated sources” are linked as the source folder in Eclipse.

+12
source

On the JHipster documentation page to configure Eclipse :

Add apt generated source folder to create path

When using gradients, the buildship default outputfolder is filtered and not displayed in your workspace. Therefore, you need to remove it from the filter eclipses resource.

  • Right click on your project and select Properties
  • Choose Resources
  • Delete build entry
  • Choose Java Build Path
  • Click Add Folder...
  • Check the path build/generated/source/apt/main

Make sure that the new source folder contains correctly generated mapper implementations when running JHipster through eclipse.

+2
source

I had the same problem with my JHipster project using Gradle. In Eclipse, I linked the directory "build \ generated \ source \ apt \ main" as the source folder, and the problem was resolved.

  • Right click on your project and go to "Properties"
  • Go to the Java Build Path and find the Source tab
  • Click the "Link Source ..."
  • Find the directory "build \ generated \ source \ apt \ main"
  • You can leave the suggested name as it is
  • Click Finish

Now you can try running the JHipster project, inside eclipse, as a Java application, and it will probably work.

0
source

All Articles