簡體   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