Я пытаюсь реализовать метод GET и POST в spring-boot. При вызове метода GET не получен правильный ответ.
Мой класс контроллера
@RestController
@RequestMapping("api/public")
public class PublicRestApiController {
@GetMapping("users")
public List<User> users(){
return this.userRepository.findAll();
}
@PostMapping(path = "/save")
@ResponseBody public User insertusers( @RequestBody UserRequest requestUser){
User user = new User(requestUser.getUsername(),passwordEncoder.encode(requestUser.getPassword()),requestUser.getRoles(),requestUser.getPermissions());
try {
user = this.userRepository.save(user);
return user;
}
catch(Error e) {
return user;
}
}
}
Класс UserRequest
public class UserRequest {
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 int getActive() {
return active;
}
public void setActive(int active) {
this.active = active;
}
public String getRoles() {
return roles;
}
public void setRoles(String roles) {
this.roles = roles;
}
public String getPermissions() {
return permissions;
}
public void setPermissions(String permissions) {
this.permissions = permissions;
}
private String username;
private String password;
private int active;
private String roles = "";
private String permissions = "";
}
Класс пользователя
@Entity
@Table(name = "USER_DETAILS")
public class User {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String PASSWORD;
@Column
private int ACTIVE;
@Column
private String ROLES = "";
@Column
private String PERMISSIONS = "";
public User(String username, String password, String roles, String permissions){
this.username = username;
this.PASSWORD = password;
this.ROLES = roles;
this.PERMISSIONS = permissions;
this.ACTIVE = 1;
}
public User(){}
public int getId() {
return id;
}
public String getUsername() {
return username;
}
public String getPassword() {
return PASSWORD;
}
public int getActive() {
return ACTIVE;
}
public String getRoles() {
return ROLES;
}
public String getPermissions() {
return PERMISSIONS;
}
public void setId(int id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.PASSWORD = password;
}
public void setActive(int active) {
this.ACTIVE = active;
}
public void setRoles(String roles) {
this.ROLES = roles;
}
public void setPermissions(String permissions) {
this.PERMISSIONS = permissions;
}
}
Класс UserRepository
@Repository
public interface UserRepository extends JpaRepository<User, Long>{
}
Метод POST работает нормально, но при вызове метода GET поле id получает значение по умолчанию 0. Не извлекаются правильные значения идентификатора. А также во время работы сервера, если я вызываю метод POST, он вставляет данные в базу данных, но эти недавно вставленные данные не извлекаются методом GET. Извлекаются только те данные, которые я уже вставил в базу данных.
В вашем классе USER есть первичный ключ с типом int
, и в вашем репозитории вы расширили
Класс USER с длинным, который должен быть целым числом, как показано ниже.
Репозиторий:
@Repository
public interface UserRepository extends JpaRepository<User, Integer>{
}
ОБНОВИТЬ:
@Autowired UserRepository userRepository;
@GetMapping("users")
public List<User> users(){
return userRepository.getAllUsers();
}
Репозиторий:
@Repository
public interface UserRepository extends JpaRepository<User, Integer>{
@Query(value = "select * from USER_DETAILS",nativeQuery=true)
List<User> getAllUsers();
}
импортировать @Query
из import org.springframework.data.jpa.repository.Query;
ОБНОВЛЕНИЕ2: Idel способ структуры проекта состоит в том, чтобы иметь разные пакеты в соответствии с поведением класса.
//Controller
@yourMapping
public returnType method1()
{
myService.performBusinessLoginonMethod1(...) //if you are using services
myReposiroty.DBOpertaion(...) //as per above case
}
//Service: myService
returnType performBusinessLoginonMethod1(...)
{
myRepository.DBOpertaion(...)
}
//Repository: myRepository
@Modifying // import org.springframework.data.jpa.repository.Modifying;
@Query(...)
returnType DBOpertaion(...)
Все еще получаю ноль только как ID.
@SrijibSen, можете ли вы добавить ответ, который вы получаете, и фактические данные в базе данных?
Добавил детали.
Здравствуйте @SrijibSen, можете ли вы попробовать выполнить ручной запрос в репозитории и поделиться ответом, и вы давно изменились на Integer в репозитории?
Да, я изменил Long на integer. И я не знаю, как использовать ручной запрос. Я только начал изучать spring-boot.
@SrijibSen, пожалуйста, сообщите об обновлении и сообщите мне результат
Да, теперь это работает. Но если мне нужно написать другой метод с другим ручным запросом, как в этом случае я могу написать и сопоставить их с методами?
Вы не возвращаете ответ должным образом. Попробуй это.
@GetMapping("users")
public ResponseEntity<List<Article>> users(){
return new ResponseEntity<List<Article>>(this.userRepository.findAll(), HttpStatus.OK);
}
Метод POST работает нормально. Данные сохраняются в базе данных. Но после вызова POST, если я вызываю GEt, вновь вставленные данные не извлекаются.
Невозможно, вы никуда не вставляете данные. Проверьте свой метод добавления в контроллере.
попробуйте
private Long id;
вместоprivate int id;
. В своем репо вы заявили, что ваш идентификатор является длинным:public interface UserRepository extends JpaRepository<User, Long>{
. Но ваша сущность используетint
. Не уверен, каковы будут последствия этого, но выглядит неправильно.