Search code examples
spring-bootget

Unable to get proper GET response


I am trying to implement a GET and a POST method in spring-boot. While calling GET method not getting proper response.

My Controller class

@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 class

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 = "";

}

User Class

@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 class

@Repository
public interface UserRepository extends JpaRepository<User, Long>{

}

POST method is working fine, but while calling GET method, id field is coming default value 0.Not fetching proper ID values. And also while running server, if I call POST method, it is inserting data in database, but that newly inserted data is not getting fetched by GET method.Only those data are getting fetched, which I have already inserted in the database.

This is the data in database

This is the response which I am getting form GET method


Solution

  • Your USER class has Primary key with Type int and in your Repository, you have extended USER class with long which should be Integer as below

    Repository:

     @Repository
     public interface UserRepository extends JpaRepository<User, Integer>{
    
     }
    

    UPDATE:

     @Autowired UserRepository userRepository;
    
             @GetMapping("users")
             public List<User> users(){
                  return userRepository.getAllUsers();
             }
    

    Repository:

     @Repository
     public interface UserRepository extends JpaRepository<User, Integer>{
          @Query(value="select * from USER_DETAILS",nativeQuery=true)
          List<User> getAllUsers();
     }
    

    import @Query from import org.springframework.data.jpa.repository.Query;


    UPDATE2: Idel way of project structure is to have different packages according to class behavior.

    • Controller
    • Service
    • Repository
    • Models or Entity
    • DTOs, DAOs
    • Security, Config etc as per the requirnments

         //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(...)