2023-11-09T18:25:27.163+01:00 WARN 14524 --- [ main]
ConfigServletWebServerApplicationContext : Exception encountered during context initialization -
cancelling refresh attempt:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'authController' defined in file
[C:\Users\karol\IdeaProjects\demo\target\classes\com\inn\project\controllers\AuthController.class]:
Unsatisfied dependency expressed through constructor parameter 0:
Error creating bean with name 'userService' defined in file [C:\Users\karol\IdeaProjects\demo
\target\classes\com\inn\project\services\UserService.class]:
Unsatisfied dependency expressed through constructor parameter 2:
No qualifying bean of type 'com.inn.project.mappers.UserMapper' available:
expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {}
字符串
我的代码中有这个错误。
这是我的UserController
package com.inn.project.controllers;
import com.inn.project.models.User;
import com.inn.project.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsers(){
return userService.getUsers();
}
@PostMapping("/users/addnew")
public void addUser(@RequestBody User user){
userService.addUser(user);
}
@PutMapping("/users/{id}/edit")
public void updateUser(@PathVariable("id") Long id, @RequestBody User user){
userService.updateUser(user);
}
@DeleteMapping("/users/{id}/delete")
public void deleteUser(@PathVariable("id") Long id){
userService.deleteUser(id);
}
}
型
AuthController
package com.inn.project.controllers;
import com.inn.project.dtos.UserDto;
import com.inn.project.services.UserService;
import lombok.RequiredArgsConstructor;
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.RestController;
@RestController
@RequiredArgsConstructor
public class AuthController {
private final UserService userService;
@PostMapping("/login")
public ResponseEntity<UserDto> login(@RequestBody Credentials credentials){
UserDto user = userService.login(credentials);
return ResponseEntity.ok(user);
}
}
型
这是用户模型
package com.inn.project.models;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Entity
@Data
@Table(name = "User")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "password")
private String password;
private String location;
private String login;
@Column(name = "notifications")
private boolean notifications;
}
型
这是Mapper:
package com.inn.project.mappers;
import com.inn.project.dtos.UserDto;
import com.inn.project.models.User;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapper {
UserDto toUser(User user);
}
型
这是UserDto:
package com.inn.project.dtos;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserDto {
private Long id;
private String firstName;
private String lastName;
private String login;
private String password;
}
型
这里是UserService
package com.inn.project.services;
import com.inn.project.controllers.Credentials;
import com.inn.project.dtos.UserDto;
import com.inn.project.exceptions.AppException;
import com.inn.project.mappers.UserMapper;
import com.inn.project.models.User;
import com.inn.project.repositories.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.nio.CharBuffer;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
private final UserMapper userMapper;
public List<User> getUsers(){
return userRepository.findAll();
}
public UserDto login(Credentials credentials){
User user = userRepository.findByLogin(credentials.login())
.orElseThrow(()-> new AppException("Uknown user", HttpStatus.NOT_FOUND));
if (passwordEncoder.matches(CharBuffer.wrap(credentials.password()),
user.getPassword()))
{
return userMapper.toUser(user);
}
throw new AppException("Invalid password", HttpStatus.BAD_REQUEST);
}
public void addUser(User user){
userRepository.save(user);
}
public void updateUser(User user){
userRepository.save(user);
}
public void deleteUser(Long id){
userRepository.deleteById(id);
}
}
<?xml version="1.0" encoding="UTF-8"?>
4.0.0 org.springframework. Boot spring- Boot boot-starter-parent 3.1.5 com.inn demo
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo</description>
<properties>
<sonar.login>sqp_154364705dbb808ea7aa8df4c3ec133df4a041ba</sonar.login>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
型
我试图找到像我这样的问题,但最后我放弃了,因为没有。我写这段代码的基础上,本教程:https://www.youtube.com/watch?v=YUqi1IjLX8I
1条答案
按热度按时间toiithl61#
您的问题是在使用mapstruct时没有真正阅读文档。
Map结构体非常像lombok,它在编译时生成代码,就像在创建一堆代码让你Map一样,lombok在编译时生成一堆getter和setter。
他们的github readme中的示例清楚地解释了如何使用它。
字符串
您还没有将注解处理器添加到编译器中,因此没有任何东西阅读您的mapstruct注解,并生成所需的代码,因此当服务器启动时,它会抱怨缺少了一些东西。
请阅读有关如何使用mapstruct的说明