Spring不在JHipster Web应用程序中注入Mapstruct生成的类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring不在JHipster Web应用程序中注入Mapstruct生成的类相关的知识,希望对你有一定的参考价值。

我正在开发使用JHipster v2.20.0创建的Web应用程序。使用Eclipse 4.5.0 WTP作为IDE。

Spring配置基于注释。

我刚刚将this pull与我们的代码合并。

[当我尝试在Eclipse中运行应用程序时,出现此异常:

[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

这是UserManagementMapper类:

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);
    }
}

这是UserManagementResource类:

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();
    }
}

最后,在合并过程中未更改pom.xml文件。合并前应用程序正常运行。

这可能是一些新手问题,但是与执行合并相比,我在解决该问题上花费了更多时间。

提前感谢您的帮助!

答案

您应确保在Eclipse中将“目标/生成的源”链接为源文件夹。

另一答案

对于IntelliJ(Gradle)用户,

Settings-> Build, Execution, Deployment-> Compiler-> Annotation Processors-> Enable annotation processing

请确保在之后进行assemble gradle。

对于maven用户,

Build tools-> Maven-> Importing-> Generated Sources folder

另一答案

JHipster documentation page for setting up Eclipse

添加易于生成的源文件夹以构建路径

使用buildship gradles时,默认输出文件夹已过滤,在您的工作区。因此,您需要将其从eclipse的资源中删除过滤器设置。

  • 右键单击您的项目,然后选择Properties
  • 选择Resources
  • 删除条目build
  • 选择Java Build Path
  • 单击Add Folder...
  • 检查路径build/generated/source/apt/main

通过Eclipse运行JHipster时,请确保新的源文件夹包含正确生成的映射器实现。

另一答案

我在使用Gradle的JHipster项目中遇到了同样的问题。在Eclipse中,我将“ build generate source apt main”目录链接为源文件夹,问题已解决。

  1. 右键单击您的项目,然后转到“属性”
  2. 转到“ Java构建路径”并查找“源”选项卡
  3. 单击按钮“链接源...”
  4. 浏览“ build generate source apt main”目录
  5. 您可以保留建议的名称
  6. 单击完成

现在您可以尝试在eclipse中将您的JHipster项目作为Java应用程序运行,它可能会工作。

另一答案

我几天前开始使用intelliJ。启用注释处理(如Shree Krishna所建议)对我有效。它记录在JHipster IDEA配置页面(https://www.jhipster.tech/configuring-ide-idea/)上。但是此页面上的当前文档对于像我这样的新IntelliJ用户而言不是明确的。

Jhispter成员应该通过更明确的内容(例如Shree Krishna的anwser)来更新其文档(这将使很多人不必花费很多时间来解决问题)。

Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors -> Enable annotation processing

以上是关于Spring不在JHipster Web应用程序中注入Mapstruct生成的类的主要内容,如果未能解决你的问题,请参考以下文章

Spring data Elasticsearch 嵌套搜索 - jhipster

jhipster spring boot 自定义身份验证提供程序

如何在 Jhipster (spring boot + angular) 应用程序上设置上下文路径

Jhipster 和 Spring Security - 添加身份验证提供程序保持活动的默认 jdbcauthentication 模式

扩展 Jhipster JWT (Spring) 单体应用程序以支持模拟

使用 Prod 配置文件运行 JHipster 应用程序时清空 Web 内容