堆疊跟蹤:org.springframework.beans.factory.UnsatisfiedDependencyException:創建名為“userController”的bean時出錯:通過欄位“userRepository”表示的依賴關系不滿足;嵌套例外是 org.springframework.beans.factory.BeanCreationException:在 JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration 上宣告的 @EnableJpaRepositories 中定義的 br.com.allen.flashfood.domain.repository.UserRepository 中創建名稱為“userRepository”的 bean 時出錯:呼叫 init 方法失敗的; 嵌套例外是 org.springframework.data.repository.query.QueryCreationException:無法為公共抽象 java.util.Optional br.com.allen.flashfood.domain.repository.CustomJpaRepository.findFirst() 創建查詢!原因:無法為方法 public abstract java.util.Optional br.com.allen 創建查詢。flashfood.domain.repository.CustomJpaRepository.findFirst()!沒有找到型別 User! 的屬性 findFirst;嵌套例外是 java.lang.IllegalArgumentException:無法為方法 public abstract java.util.Optional br.com.allen.flashfood.domain.repository.CustomJpaRepository.findFirst() 創建查詢!沒有找到型別用戶的屬性 findFirst!
課程:
- 控制器:
package br.com.allen.flashfood.api.controller;
import br.com.allen.flashfood.api.assembler.UserModelAssembler;
import br.com.allen.flashfood.api.assembler.UserRequestDisassembler;
import br.com.allen.flashfood.api.model.request.PasswordRequest;
import br.com.allen.flashfood.api.model.request.UserPasswordRequest;
import br.com.allen.flashfood.api.model.request.UserRequest;
import br.com.allen.flashfood.api.model.response.UserResponse;
import br.com.allen.flashfood.domain.model.User;
import br.com.allen.flashfood.domain.repository.UserRepository;
import br.com.allen.flashfood.domain.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@Autowired
private UserService userService;
@Autowired
private UserModelAssembler userModelAssembler;
@Autowired
private UserRequestDisassembler userRequestDisassembler;
@GetMapping
public List<UserResponse> getAllUsers() {
List<User> allUsers = userRepository.findAll();
return userModelAssembler.toCollectionModel(allUsers);
}
@GetMapping("/{userId}")
public UserResponse getUserById(@PathVariable Long userId) {
User user = userService.findUserOrElseThrow(userId);
return userModelAssembler.toModel(user);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public UserResponse addUser(@RequestBody @Valid UserPasswordRequest userPasswordRequest) {
User user = userRequestDisassembler.toDomainObject(userPasswordRequest);
user = userService.saveUser(user);
return userModelAssembler.toModel(user);
}
@PutMapping("/{userId}")
public UserResponse updateUser(@PathVariable Long userId,
@RequestBody @Valid UserRequest userRequest) {
User actualUser = userService.findUserOrElseThrow(userId);
userRequestDisassembler.copyToDomainObject(userRequest, actualUser);
actualUser = userService.saveUser(actualUser);
return userModelAssembler.toModel(actualUser);
}
@PutMapping("/{userId}/password")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void userPassword(@PathVariable Long userId,
@RequestBody @Valid PasswordRequest passwordRequest) {
userService.changePassword(userId, passwordRequest.getActualPassword(), passwordRequest.getNewPassword());
}
}
存盤庫:
package br.com.allen.flashfood.domain.repository;
import br.com.allen.flashfood.domain.model.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends CustomJpaRepository<User, Long> {
}
CustomJpaRepository
package br.com.allen.flashfood.domain.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;
import java.util.Optional;
@NoRepositoryBean
public interface CustomJpaRepository<T, ID> extends JpaRepository<T, ID> {
Optional<T> findFirst();
}
用戶:
package br.com.allen.flashfood.domain.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@EqualsAndHashCode.Include
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String password;
@CreationTimestamp
@Column(nullable = false, columnDefinition = "datetime")
private OffsetDateTime registrationDate;
@ManyToMany
@JoinTable(name = "user_group",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "group_id"))
private List<Family> groups = new ArrayList<>();
public boolean passwordConfirmed(String password) {
return getPassword().equals(password);
}
public boolean passwordNotConfirmed(String password) {
return !passwordConfirmed(password);
}
}
編輯 1:我忘記了對實施提出質疑,因為我認為現在通過編輯問題不可能是這樣。
package br.com.allen.flashfood.infrastructure.repository;
import br.com.allen.flashfood.domain.repository.CustomJpaRepository;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import javax.persistence.EntityManager;
import java.util.Optional;
public class CustomJpaRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> implements CustomJpaRepository<T, ID> {
private EntityManager entityManager;
public CustomJpaRepositoryImpl(JpaEntityInformation<T, ?> entityInformation,
EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
}
@Override
public Optional<T> findFirst() {
var jpql = "from " getDomainClass().getName();
T entity = entityManager.createQuery(jpql, getDomainClass())
.setMaxResults(1)
.getSingleResult();
return Optional.ofNullable(entity);
}
}
uj5u.com熱心網友回復:
該方法findFirst()本身并不存在。您需要為此添加更多運算式,例如findFirstByName(String name). 換句話說,您將無法使用findFirst可以正確繼承的方法創建超類。我真的沒有在這里看到我會創建另一個介面來擴展的情況,你可能會更好地JpaRepository從你的UserRepository.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464395.html
下一篇:反應路由器v6路由問題
