Spring Boot JPA错误:“不是受管理的类型:类com.example1.project.User.User”。

huangapple go评论107阅读模式
英文:

Spring Boot JPA Error: "Not a managed type: class com.example1.project.User.User

问题

I'm a beginner in Spring Boot and JPA. I'm developing an application using these technologies, but I've run into a problem. When I run the application, I encounter a 'Not a managed type' exception related to my User entity class.

User entity class:

package com.example1.project.User;

import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;

@Entity
@Table(name = "users")
public class User
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotBlank
    private String name;
    @Email
    @NotBlank
    private String email;
    @NotBlank
    private String username;
    @NotBlank
    private String password;

    // Constructors, Getters, and Setters
}

UserRepository:

package com.example1.project.User;

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

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

UserService:

package com.example1.project.User;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    // Constructor, authenticateUser method, and other service methods
}

LoginController:

package com.example1.project.Login;

import com.example1.project.User.User;
import com.example1.project.User.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/login")
public class LoginController {
    // Constructor and login method
}

I initially suspected that there might be an issue with the way I had annotated my entity classes, so I double-checked them to make sure I had used the correct annotations. I was expecting that if the annotations were correct, the application would run without any 'Not a managed type' errors. However, even though my entity classes seem to be correctly annotated, the error still persists.

This is my project structure:

src
├── main
│   └── java
│       └── com.example1.project
│           ├── Login (subpackage)
│           ├── Order (subpackage)
│           ├── Product (subpackage)
│           ├── User (subpackage)
│           └── Application (main class)
│           └── CorsConfig (class)
│           └── SecurityConfiguration (class)
└── test

The new error:

In my MySQL table called product, this table has 4 columns called id, description, name, price, I wanted to send this data from Postman to MySQL:

{
  "name": "Case",
  "price": 19.99
}

But when I press Send, I get a 401 Unauthorized error in Postman, and the URL is http://localhost:8080/api/products.

I added a class called SecurityConfiguration thinking that if I set the username "user" and the password "password," I could go to PostMan → Authorization and add the user and password as credentials, but I get the same error:

SecurityConfiguration:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
public class SecurityConfiguration {
    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }
}

ProductController class:

package com.example1.project.Product;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/products")
public class ProductController {
    // Constructor and various endpoints for handling products
}

When I start my application, I get the following in the console:

2023-08-01T18:05:24.940+03:00  INFO 13520 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-08-01T18:05:24.941+03:00  INFO 13520 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-08-01T18:05:24.943+03:00  INFO 13520 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms
2023-08-01T18:13:33.563+03:00  WARN 13520 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=7m32s427ms71μs900ns).
英文:

I'm a beginner in Spring Boot and JPA. I'm developing an application using these technologies, but I've run into a problem. When I run the application, I encounter a 'Not a managed type' exception related to my User entity class.

Error starting ApplicationContext. To display the conditions report re-run your application with &#39;debug&#39; enabled.

2023-07-31 15:11:07.786 ERROR 15380 --- \[           main\] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;loginController&#39; defined in file \[C:\-project\\target\\classes\\com\\example1\\project\\Login\\LoginController.class\]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;userService&#39; defined in file \[C:\-project\\target\\classes\\com\\example1\\project\\User\\UserService.class\]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;userRepository&#39; defined in com.example1.project.User.UserRepository defined in @EnableJpaRepositories declared on Application: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example1.project.User.User

User entity class:

package com.example1.project.User;

import jakarta.persistence.*;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;

@Entity
@Table(name = &quot;users&quot;)
public class User
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NotBlank
    private String name;
    @Email
    @NotBlank
    private String email;
    @NotBlank
    private String username;
    @NotBlank
    private String password;

    public User() {}

    // Getters and Setters
    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

UserRepository:

package com.example1.project.User;


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

public interface UserRepository extends JpaRepository&lt;User, Long&gt; {
    User findByUsername(String username);

}

UserService:

package com.example1.project.User;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    public User authenticateUser(String username, String password) {
        User user = userRepository.findByUsername(username);

        if (user != null) {
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
            if (passwordEncoder.matches(password, user.getPassword())) {
                return user; 
            }
        }

        return null; 
    }

    // Implement service methods using the repository methods
    public List&lt;User&gt; getAllUsers() {
        return userRepository.findAll();
    }

    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public User saveUser(User user) {
        user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
        return userRepository.save(user);
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }

    
}

LoginController:

package com.example1.project.Login;

import com.example1.project.User.User;
import com.example1.project.User.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(&quot;/api/login&quot;)
public class LoginController {
    private final UserService userService;

    @Autowired
    public LoginController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping
    public ResponseEntity&lt;?&gt; login(@RequestBody LoginRequest loginRequest) {
        // Extract username and password from the login request payload
        String username = loginRequest.getUsername();
        String password = loginRequest.getPassword();

       
        User authenticatedUser = userService.authenticateUser(username, password);

        if (authenticatedUser != null) {
            // User is authenticated, return user data or a token (if using token-based authentication)
            return ResponseEntity.ok(authenticatedUser);
        } else {
            // Invalid credentials, return an error response
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(&quot;Invalid username or password&quot;);
        }
    }
}

I initially suspected that there might be an issue with the way I had annotated my entity classes, so I double-checked them to make sure I had used the correct annotations. I was expecting that if the annotations were correct, the application would run without any 'Not a managed type' errors. However, even though my entity classes seem to be correctly annotated, the error still persists

This is my project structure:

src
├── main
│   └── java
│       └── com.example1.project
│                             └──Login(subpackage)
│                             └──Order(subpackage)
│                             └──Product(subpackage)
│                             └──User(subpackage)
│                             └──Application(main class)
│                             └──CorsConfig(class)                          
│                             └──SecurityConfiguration(class)                     
└── test

  

The new error:

In my mysql table called product ,this table has 4 columns called id,description,name,price,i wanted to send from postman to mysql this data:

{
  &quot;name&quot;: &quot;Case&quot;,
  &quot;price&quot;: 19.99
}

But when i press Send, i get 401 Unauthorized in postman ,the url is http://localhost:8080/api/products.

I added a class called SecurityConfiguration thinking that if i set the username "user" and the password "password" i could go to PostMan→Authorization and add the user and password as credentials but i get the same error:

import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.security.core.userdetails.User;
        import org.springframework.security.core.userdetails.UserDetails;
        import org.springframework.security.provisioning.InMemoryUserDetailsManager;

        import javax.sql.DataSource;

@Configuration
public class SecurityConfiguration {
    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username(&quot;user&quot;)
                .password(&quot;password&quot;)
                .roles(&quot;USER&quot;)
                .build();
        return new InMemoryUserDetailsManager(user);
    }
}


This is my ProductController class:

package com.example1.project.Product;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(&quot;/api/products&quot;)
public class ProductController {
    private final ProductService productService;

    @Autowired
    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @GetMapping
    public List&lt;Product&gt; getAllProducts() {
        return productService.getAllProducts();
    }

    @GetMapping(&quot;/{id}&quot;)
    public Product getProductById(@PathVariable Long id) {
        return productService.getProductById(id);
    }

    @GetMapping(&quot;/search&quot;)
    public List&lt;Product&gt; searchProducts(@RequestParam String keyword) {
        return productService.searchProducts(keyword);
    }

    @PostMapping
    public Product addProduct(@RequestBody Product product) {
        return productService.saveProduct(product);
    }

    @PutMapping(&quot;/{id}&quot;)
    public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {
        product.setId(id);
        return productService.saveProduct(product);
    }

    @DeleteMapping(&quot;/{id}&quot;)
    public void deleteProduct(@PathVariable Long id) {
        productService.deleteProduct(id);
    }
}


When i start my application i get this in the console:

2023-08-01T18:05:24.940+03:00  INFO 13520 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet &#39;dispatcherServlet&#39;
2023-08-01T18:05:24.941+03:00  INFO 13520 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet &#39;dispatcherServlet&#39;
2023-08-01T18:05:24.943+03:00  INFO 13520 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms
2023-08-01T18:13:33.563+03:00  WARN 13520 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=7m32s427ms71&#181;s900ns).

答案1

得分: 0

在你的安全配置类中,你还需要一个允许 httpBasic 认证的 SecurityFilterChain bean,这就是你收到 401 未授权错误的原因,我认为我有帮助。

只需查看文档Configuration中的HttpSecurity模块。

英文:

In your Security Configuration class you also need a bean of SecurityFilterChain that permits httpBasic authentication, its the reason why you get 401 unauthorized, think i was helpful

Just have a look at documentation
Configuration
at HttpSecurity module

huangapple
  • 本文由 发表于 2023年7月31日 23:06:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/76804912.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定