繁体   English   中英

SpringBoot @Service 注解问题

[英]SpringBoot @Service annotation issue

大家好,我正在开发一个应用程序。我创建了一个模型,但在给出所有注释并配置所有属性后,它显示以下错误。 任何人都可以看看下面的问题吗? 应用程序属性

spring.datasource.url = jdbc:mysql://localhost:3306/expenses
spring.datasource.username =dante
spring.datasource.password =jboss
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.format_sql=true
server.port=9191

主类

package com.expenses.demo;

import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.expenses.demo.modal.Role;
import com.expenses.demo.modal.User;
import com.expenses.demo.modal.UserRole;
import com.expenses.service.UserService;

@SpringBootApplication
public class ExpenseApplication implements CommandLineRunner {
    
    @Autowired
    private UserService userService;
    
    public static void main(String[] args) {
        SpringApplication.run(ExpenseApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Starting code");
        
        User user = new User();
        user.setFirstname("Aniket");
        user.setLastname("Turiley");
        user.setEmail("abc@gmail.com");
        user.setPassword("abc");
        user.setPhone("99220289");
        
        Role role1=new Role();
        role1.setRoleId(44L);
        role1.setRoleName("ADMIN");
        
        Set<UserRole> userRoleSet = new HashSet<>();
        UserRole userRole = new UserRole();
        userRole.setRole(role1);
        userRole.setUser(user);
        userRoleSet.add(userRole);
        
        User user1= this.userService.createUser(user,userRoleSet);
        System.out.println(user1.getUsername());
        
        
        
    }

}

模型类

角色.java

package com.expenses.demo.modal;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="roleinformation")
public class Role {
    @Id
    private long roleId;
    private String roleName;
    
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "role")
    private Set<UserRole> userRoles = new HashSet<>();
    public Role() {
    
    }
    
    
    public Role(int roleId, String roleName) {
        
        this.roleId = roleId;
        this.roleName = roleName;
    }
    public long getRoleId() {
        return roleId;
    }
    public void setRoleId(long l) {
        this.roleId = l;
    }
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }


    public Set<UserRole> getUserRoles() {
        return userRoles;
    }


    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }
    
    

}

用户.java

package com.expenses.demo.modal;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name="usersinfo")

public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private  Long id;
    private String firstname;
    private String lastname;
    private String username;
    private String password;
    private String email;
    private String phone;
    private boolean enable=true;
    
    // user has many roles
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER,mappedBy = "user")
    @JsonIgnore
    private Set<UserRole> userRoles = new HashSet<>();
    
    public User() {
        
    }
    
    
    
    public User(Long id, String firstname, String lastname, String username, String password, String email,
            String phone, boolean enable) {
        
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.username = username;
        this.password = password;
        this.email = email;
        this.phone = phone;
        this.enable = enable;
    }



    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    public String getLastname() {
        return lastname;
    }
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public boolean isEnable() {
        return enable;
    }
    public void setEnable(boolean enable) {
        this.enable = enable;
    }



    public Set<UserRole> getUserRoles() {
        return userRoles;
    }



    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }
    
    
    

}

存储库接口

角色库

package com.expenses.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.expenses.demo.modal.Role;

public interface RoleRepository extends JpaRepository<Role, Long>{

}


用户库

package com.expenses.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.expenses.demo.modal.User;

public interface UserRepository extends JpaRepository<User, Long> {

    public User findByUsername(String username);

}

服务等级

服务.java

package com.expenses.service;

import java.util.Set;


import com.expenses.demo.modal.User;
import com.expenses.demo.modal.UserRole;

public interface UserService {
    
    //creating user
    public User createUser(User user,Set<UserRole> userRoles) throws Exception;
    

}

服务实现类

服务实现.java

package com.expenses.service;

import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.expenses.demo.modal.User;
import com.expenses.demo.modal.UserRole;
import com.expenses.repository.RoleRepository;
import com.expenses.repository.UserRepository;
import com.expenses.service.UserService;

@Service
public class UserServiceImplementation implements UserService{
    
    
    private UserRepository userRepository;
    
    @Autowired
    private RoleRepository roleRepository;
    
    
    @Override
    public User createUser(User user, Set<UserRole> userRoles) throws Exception{
         
        User local= this.userRepository.findByUsername(user.getUsername());
        if(local!=null) {
            System.out.println("User Already Exist");
            throw new Exception("User Already Exist");
        }else {
            // user create
            for(UserRole ur:userRoles) {
                roleRepository.save(ur.getRole());
            }
            user.getUserRoles().addAll(userRoles);
            local = this.userRepository.save(user);
        }
        return local;
    }

}


错误

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
[2m2021-07-28 18:16:59.304[0;39m [31mERROR[0;39m [35m8492[0;39m [2m---[0;39m [2m[  restartedMain][0;39m [36mo.s.b.d.LoggingFailureAnalysisReporter  [0;39m [2m:[0;39m 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field userService in com.expenses.demo.ExpenseApplication required a bean of type 'com.expenses.service.UserService' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.expenses.service.UserService' in your configuration.


Spring Boot 将仅对与主类( @SpringBootApplication注释类)及其子包位于同一包中的类进行组件扫描(搜索带有@Service@Repository@Controller@Component )注释。

所以你需要八个

  • ExpenseApplication一包上移,到com.expenses
  • 将组件扫描需要找到的所有类移动到com.expenses.demo或子包,或
  • 配置组件扫描(以及 Spring Data),例如通过@SpringBootApplication(scanBasePackages = "com.expenses")

BTW:纳吉布·阿里夫是正确的也是如此,除了你需要添加@AutowiredUserServiceImplementation.userRepository但我认为你不需要到添加@Repository注解的Spring的数据JPA库接口。

将此添加到您的主类

@SpringBootApplication(scanBasePackages = "com.expenses")

这将有助于组件扫描找到您的类。

首先标记您的两个存储库

@Repository

在您的用户服务中,您缺少 Autowired 注释。

我个人喜欢构造函数注入。

角色库

    @Repository
    public interface RoleRepository extends JpaRepository<Role, Long>{
    }

用户回购也是如此。

在您的用户服务实现中

@Service
public class UserServiceImplementation implements UserService{
    
    
    private final UserRepository userRepository;
    private final RoleRepository roleRepository;

    /* when using constructor injection @Autowired is not required */
    public UserServiceImplementation(UserRepository userRepository, RoleRepository roleRepository){
       this.userRepository = userRepository;
       this.roleRepository = roleRepository;
    }

    @Override
    public User createUser(User user, Set<UserRole> userRoles) throws Exception{
        //...
    }

}

暂无
暂无

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

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