遇到连接Spring应用程序到MySQL数据库的问题。

huangapple go评论81阅读模式
英文:

Trouble connecting spring application to Mysql Database

问题

I'm sorry, but it seems like your request contains a lot of code and technical details. I can help you translate specific parts of the content, but I won't be able to provide a full translation of the entire code and logs. If you have specific sentences or phrases you'd like me to translate, please let me know, and I'll be happy to assist.

英文:

Hi I'm relatively new to spring working through this spring tutorial: <https://spring.io/guides/gs/accessing-data-mysql/>

I'm using the code provided and have set up the MySql database as suggested, however using cURL command gives the following error:

>>curl localhost:8080/demo/add -d name=First -d email=someemail@someemailprovider.com <!doctype html><html lang="en"><head><title>HTTP Status 500 ÔÇô Internal Server Error</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 500 ÔÇô Internal Server Error</h1></body></html>

MainController:

package Controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import Repository.UserRepository;
import com.example.demo.Model.*;

@Controller // This means that this class is a Controller
@RequestMapping(path=&quot;/demo&quot;) // This means URL&#39;s start with /demo (after Application path)
public class MainController {
  @Autowired // This means to get the bean called userRepository
         // Which is auto-generated by Spring, we will use it to handle the data
  private UserRepository userRepository;

  @PostMapping(path=&quot;/add&quot;) // Map ONLY POST Requests
  public @ResponseBody String addNewUser (@RequestParam String name
      , @RequestParam String email) {
    // @ResponseBody means the returned String is the response, not a view name
    // @RequestParam means it is a parameter from the GET or POST request

    User n = new User();
    n.setName(name);
    n.setEmail(email);
    userRepository.save(n);
    return &quot;Saved&quot;;
  }

  @GetMapping(path=&quot;/all&quot;)
  public @ResponseBody Iterable&lt;User&gt; getAllUsers() {
    // This returns a JSON or XML with the users
    return userRepository.findAll();
  }
}

User.java

package com.example.demo.Model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // This tells Hibernate to make a table out of this class
public class User {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Integer id;

  private String name;

  private String email;

  public Integer getId() {
    return id;
  }

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

  public String getName() {
    return name;
  }

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

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }
}           

UserRepository.java

package Repository;

import org.springframework.data.repository.CrudRepository;

import com.example.demo.Model.User;

// This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
// CRUD refers Create, Read, Update, Delete

public interface UserRepository extends CrudRepository&lt;User, Integer&gt; {

}

application.properties

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=ThePassword

Gradle.build

plugins {
	id &#39;org.springframework.boot&#39; version &#39;2.3.2.RELEASE&#39;
	id &#39;io.spring.dependency-management&#39; version &#39;1.0.9.RELEASE&#39;
	id &#39;java&#39;
	id &#39;war&#39;
}

group = &#39;com.example&#39;
version = &#39;0.0.1-SNAPSHOT&#39;
sourceCompatibility = &#39;11&#39;

repositories {
	mavenCentral()
}

dependencies {
	implementation &#39;org.springframework.boot:spring-boot-starter-data-jpa&#39;
	implementation &#39;org.springframework.boot:spring-boot-starter-web&#39;
	runtimeOnly &#39;mysql:mysql-connector-java&#39;
	providedRuntime &#39;org.springframework.boot:spring-boot-starter-tomcat&#39;
	testImplementation(&#39;org.springframework.boot:spring-boot-starter-test&#39;) {
		exclude group: &#39;org.junit.vintage&#39;, module: &#39;junit-vintage-engine&#39;
	}
}

test {
	useJUnitPlatform()
}

Console Logs,

doesn't seem to be picking up database 2020-08-06 16:38:44.272 INFO 17940 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 9ms. Found 0 JPA repository interfaces.

2020-08-06 16:38:46.196  WARN 17940 --- [         task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator     : HHH000342: Could not obtain connection to query metadata : The server time zone value &#39;GMT Summer Time&#39; is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the &#39;serverTimezone&#39; configuration property) to use a more specifc time zone value if you want to utilize time zone support.
2020-08-06 16:39:18.344  INFO 17940 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet &#39;dispatcherServlet&#39;
2020-08-06 16:39:18.344  INFO 17940 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet &#39;dispatcherServlet&#39;
2020-08-06 16:39:18.348  INFO 17940 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 4 ms
2020-08-06 16:39:18.363 ERROR 17940 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Could not create JPA EntityManager; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]] with root cause

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when &#39;hibernate.dialect&#39; not set
```

```
2020-08-06 16:39:18.369 ERROR 17940 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] threw exception

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when &#39;hibernate.dialect&#39; not set
```

```
2020-08-06 16:39:18.370 ERROR 17940 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost]           : Exception Processing ErrorPage[errorCode=0, location=/error]

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Could not create JPA EntityManager; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
```


</details>


# 答案1
**得分**: 1

你的代码中存在两个问题:

1 - 你没有在你的存储库类上添加 @Repository 注解。因此,系统无法找到任何存储库接口。

2 - 你的 curl 命令写错了。你将姓名和电子邮件作为请求体参数发送,但理想情况下应该将它们作为查询参数发送。当你在控制器中使用 @RequestParam 时,这是期望的方式。

```curl --location --request POST 'localhost:8080/demo/add?name=First&email=email@dds.com'```

<details>
<summary>英文:</summary>

There are two issues in your code

1 - You have not added @Repository annotation to your repository class. So, system is not able to find any repository interfaces

2 - You are making wrong curl command. You are sending name and email as body parameters. You should ideally send them as query parameters. This is what is expected when you use @RequestParam in controller

```
curl --location --request POST &#39;localhost:8080/demo/add?name=First&amp;email=email@dds.com&#39;
```

</details>



# 答案2
**得分**: 1

根据控制台中的错误信息,我认为您在`application.properties`文件中缺少以下配置:

```
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
```

请选择与您的MySQL版本匹配的方言。

<details>
<summary>英文:</summary>

By the error in the console, I think you&#39;re missing this in application.properties:

    spring.datasource.driverClassName=com.mysql.jdbc.Driver
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

Chose the dialect matching your mysql version.

</details>



# 答案3
**得分**: 1

需要将以下内容附加到数据源:

```
?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC
```

信用来源:
<details> <summary>英文:</summary> Needed to append the below onto datasource ``` ?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC ``` credit
</details>

huangapple
  • 本文由 发表于 2020年8月6日 22:29:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/63285814.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定