【问题标题】:Spring-boot issue with "There was an unexpected error (type=Internal Server Error, status=500)."“出现意外错误(类型=内部服务器错误,状态=500)”的 Spring-boot 问题。
【发布时间】:2020-03-09 00:50:18
【问题描述】:

我使用 spring-boot 启动了一个项目,实际上我正在尝试在我的 localhost 端口上获取 JSON(如果我理解的话)信息。但是我遇到了这个错误:“Internal Server Error, status=500”

我在某个地方犯了一个愚蠢的错误,但我找不到我做错的地方...... 我正在将 springboot 与 JPA 和 h2 数据库一起使用

提前感谢您的帮助!

这是我的代码:

型号:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @Column (name = "name", nullable = false, unique = false)
    private String name;
    @Column (name = "firstname", nullable = false, unique = false)
    private String firstname;
    @Column (name = "username", nullable = false, unique = true)
    private String username;
    @Column (name = "email", nullable = false, unique = true)
    private String email;

    // Constructors
    public User(int id, String name, String firstname, String username, String email) {
        super();
        this.id = id;
        this.name = name;
        this.firstname = firstname;
        this.username = username;
        this.email = email;
    }

    public User(String name, String firstname, String username, String email) {
        super();
        this.name = name;
        this.firstname = firstname;
        this.username = username;
        this.email = email;
    }

    //Getters Setters
    public User() {
        super();
    }

    public long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    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;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((username == null) ? 0 : username.hashCode());
        result = prime * result + ((email == null) ? 0 : email.hashCode());
        result = prime * result + ((firstname == null) ? 0 : firstname.hashCode());
        result = prime * result + (int) (id ^ (id >>> 32));
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (username == null) {
            if (other.username != null)
                return false;
        } else if (!username.equals(other.username))
            return false;
        if (email == null) {
            if (other.email != null)
                return false;
        } else if (!email.equals(other.email))
            return false;
        if (firstname == null) {
            if (other.firstname != null)
                return false;
        } else if (!firstname.equals(other.firstname))
            return false;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", firstname=" + firstname + ", Username=" + username + ", email="
                + email + ", getId()=" + getId() + ", getName()=" + getName() + ", getFirstname()=" + getFirstname()
                + ", getUsername()=" + getUsername() + ", getEmail()=" + getEmail() + ", hashCode()=" + hashCode()
                + ", getClass()=" + getClass() + ", toString()=" + super.toString() + "]";
    }


    }

控制器:

@Controller
@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
public class UserController {

    @Autowired
    UserService UserService;

    @GetMapping(value = "/user/{id}")
    public Optional<User> findById(@PathVariable int id) {
        return UserService.findById(id);
    }

    @GetMapping(value = "/user/{name}")
    public Optional<User> findByName(@PathVariable String name) {
        return UserService.findByName(name);
    }
}

存储库:

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

    Optional <User> findById(int id);

    Optional <User> findByName(String name);

}

服务:

@Service
public class UserService {

    @Autowired
    static UserRepository UserRepository;

    public Optional<User> findById(int id) {
        return UserRepository.findById(id);

    }
    public Optional<User> findByName(String name) {
        return UserRepository.findByName(name);
}
}

我存储用户对象的Data.sql:

INSERT INTO User (ID, name , firstname, userName, email) VALUES
(1 , 'bon', 'jean', 'bjean', 'bjean@gmail.com');

INSERT INTO User (ID, name , firstname, userName, email) VALUES
(2 , 'motte', 'bob', 'bmotte', 'bmotte@gmail.com');

INSERT INTO User (ID, name , firstname, userName, email) VALUES
(3 , 'wose', 'guy', 'gwose', 'gwose@gmail.com');

application_properties:

# To See H2 Console in Browser:
# http://localhost:8080/h2-console
# Enabling H2 Console
spring.h2.console.enabled=true

# ===============================
# DATABASE CONNECTION
# ===============================
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=h2
spring.datasource.password=h2

# ===============================
# JPA / HIBERNATE
# ===============================
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

【问题讨论】:

  • 错误 500 是内部服务器错误,您应该在休息功能上放置一个断点并调试以查看发生了什么。
  • 您的应用程序控制台中没有任何错误消息?
  • @LHCHIN 我的控制台没有错误!
  • 您有全局控制器异常处理程序或类似的吗?
  • 如果用户被简单地命名为"47"(如"Agent 47")怎么办?当/user/47 的请求进来时,Spring 怎么知道调用这两种方法中的哪一种呢?它不能,因此您需要重新考虑您的 URL 方案。

标签: java sql json spring-boot spring-data-jpa


【解决方案1】:

我认为你必须更改 GetMapping 值,例如:

@GetMapping(value = "/user/{id}")
public Optional<User> findById(@PathVariable int id) {
    return UserService.findById(id);
}

@GetMapping(value = "/user/by-name/{name}")
public Optional<User> findByName(@PathVariable String name) {
    return UserService.findByName(name);
}

@GetMapping(value = "/user/")
public Optional<User> findByName(@RequestParam(name="name") String name) {
    return UserService.findByName(name);
}

并且它可以与相对url一起使用:/user/?name=bon

【讨论】:

    【解决方案2】:

    我终于找到了我的问题。

    感谢您花时间帮助我!

    我刚刚删除了我的服务类并像这样更新了我的控制器,它现在直接通过存储库传递:

    @RestController
    @CrossOrigin(origins = "*", maxAge = 3600)
    public class UserController {
    
        @Autowired
        UserRepository userRepository;
    
        @GetMapping(value = "/user/{id}")
        public Optional<User> findById(@PathVariable(required = true) int id) {
            return userRepository.findById(id);
        }
    
        @GetMapping(value = "/user/name/{name}")
        public Optional<User> findByName(@PathVariable(required = true) String name) {
            return userRepository.findByName(name);
        }
    }
    
    

    【讨论】:

    • 不过,使用服务是更好的方法。
    猜你喜欢
    • 2019-04-30
    • 2020-10-18
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2023-02-20
    • 2016-08-17
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多