繁体   English   中英

Micronauts 无法为类的参数 [entityManager] 注入值:UserRepository

[英]Micronauts Failed to inject value for parameter [entityManager] of class: UserRepository

我正在尝试在存储库中注入 EntityManager。 编译成功,但是当我运行应用程序并发送发布请求时,出现此错误:

Unexpected error occurred: Failed to inject value for parameter [entityManager] of class: aututor.apps.DAO.Repository.RepositoryImp.UserRepository

Message: No bean of type [javax.persistence.EntityManager] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).
Path Taken: new UserController([UserService service]) --> new UserServiceImpl([IUserRepository userRepository]) --> new UserRepository([EntityManager entityManager])
io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [entityManager] of class: aututor.apps.DAO.Repository.RepositoryImp.UserRepository

这是存储库:

package aututor.apps.DAO.Repository.IRepository;

import aututor.apps.DAO.Model.*;

public interface  IUserRepository  {
    public User save(User User);
    public  User findByEmail(String Email);
}

package aututor.apps.DAO.Repository.RepositoryImp;

import aututor.apps.DAO.Model.User;
import aututor.apps.DAO.Repository.IRepository.IUserRepository;
import io.micronaut.configuration.hibernate.jpa.scope.CurrentSession;
import javax.inject.Singleton;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


@Singleton
public class UserRepository implements IUserRepository {

    @PersistenceContext
    protected  EntityManager entityManager;

    public UserRepository(@CurrentSession EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Override
    public User save(User User) {
        return  entityManager.merge(User);
    }


    @Override
    public User findByEmail(String Email) {
        return entityManager.createQuery("SELECT user FROM User user  WHERE user.Email = :email", User.class)
                .setParameter("email", Email)
                .getSingleResult();
    }
}

这是服务:

package aututor.apps.Services.ServicesImpl;

import aututor.apps.DAO.Model.User;
import aututor.apps.DAO.Repository.IRepository.IUserRepository;
import aututor.apps.DTO.Mapper.UserMapper;
import aututor.apps.DTO.UserDTO;
import aututor.apps.Services.IServices.UserService;
import aututor.apps.Util.Response;

import javax.inject.Singleton;

@Singleton
public class UserServiceImpl  implements UserService {
    protected final IUserRepository userRepository;
    protected final UserMapper userMapper= new UserMapper();

    public UserServiceImpl(IUserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public Response CreateUser(UserDTO User) {

        if(userRepository.findByEmail(User.getEmail())==null) {
            User u = userRepository.save(userMapper.ToUser(User));
            return new Response("request has succeeded",userMapper.ToUserDTO(u),200);
        }
        else {
            return new Response("Not Acceptable : Adress email already exist",null,406);
        }
    }

    @Override
    public Response UpdateUser(UserDTO User) {
        return null;
    }

    @Override
    public Response DeleteUser(UserDTO User) {
        return null;
    }

    @Override
    public Response FindUserByID(Long Id) {
        return null;
    }

}

控制器 :

package aututor.apps.Controllers;

import aututor.apps.DTO.UserDTO;
import aututor.apps.Services.IServices.UserService;
import aututor.apps.Util.Response;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.*;

@Controller("/rest/User")
public class UserController {
protected final UserService service ;

    public UserController(UserService service) {
        this.service = service;
    }

    @Post("/")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response CreateUser(@Body  UserDTO user) {
        return service.CreateUser(user);
    }
}

构建.gradle:

dependencies {
    annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
    annotationProcessor "io.micronaut:micronaut-inject-java"
    annotationProcessor "io.micronaut:micronaut-validation"
    annotationProcessor "io.micronaut.data:micronaut-data-processor:1.0.0"
    implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
    implementation "io.micronaut:micronaut-security-jwt"
    implementation "io.micronaut:micronaut-http-client"
    implementation "io.micronaut:micronaut-validation"
    implementation "io.micronaut:micronaut-http-server-netty"
    implementation "io.micronaut.configuration:micronaut-hibernate-jpa"
    implementation("io.micronaut:micronaut-spring")
    compile "io.micronaut.configuration:micronaut-jdbc-tomcat"
    compile "io.micronaut:micronaut-runtime"
    compile "io.micronaut:micronaut-inject"
    compile("io.micronaut.data:micronaut-data-hibernate-jpa")
    compile("io.micronaut.data:micronaut-data-jdbc")
    compile("org.postgresql:postgresql:42.2.1")
    runtimeOnly "ch.qos.logback:logback-classic:1.2.3"
    testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
    testAnnotationProcessor "io.micronaut:micronaut-inject-java"
    testImplementation platform("io.micronaut:micronaut-bom:$micronautVersion")
    testImplementation "org.junit.jupiter:junit-jupiter-api"
    testImplementation "io.micronaut.test:micronaut-test-junit5"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
}

应用程序.yml:

---
micronaut:
  application:
    name: apps
  server:
    port: 8089

---

datasources:
  default:
    url: jdbc:postgresql://localhost:5432/db
    username: root
    password: ''
    schema-generate: CREATE_DROP
jpa:
  default:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        dialect: org.hibernate.dialect.PostgreSQL95Dialect
    entity-scan:
      packages: 'apps.model'

我曾尝试使用 CrudRepository,但那里也存在问题。 一切看起来都正确,我不知道我是否错过了什么。

我开始使用 Micronaut JPA 和 Hibernate 并遇到了与您相同的问题。 无论扫描 application.yml 的任何内容都不能告诉您您是否没有正确定义 jpa 设置。 在从查看您的设置中获得了数天试图让 Micronaut 处理数据的经验之后(并且在完全放弃使用 Micronaut 访问数据的边缘)之后,我最好的选择是您定义了您的实体 -扫描包错误。 如果您指定实体扫描包,则它必须是一个封装了您的类的包,或者是您的类的父封装包,这些类使用 @Entity 进行了注释。 在您的情况下,您将 apps.model 指定为您的包,但我在您提供的代码中没有看到您引用遵循该包格式的任何内容的位置。 不知道为什么你有一个 autoutor.apps.DAO.Model.User 包。 模型应该与您的 DAO 分开。 最简单的方法是删除实体扫描包并让所有类都被扫描。 指定包应该可以提高性能,但是如果您没有很多文件,我认为这没有什么区别。 您可以将 autoutor 或 autoutor.apps 或 autoutor.apps.DAO 或 autoutor.apps.DAO.Model 指定为您的扫描包,如果您的带有 @Entity 的类在 autoutor.apps.DAO.Model 包中,这应该可以工作。

在您的存储库类上应用注释@Repository

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM