java之"Accesing data with MySQL"教程之后的异常之SpringBoot JPA Hibernate

grandyang 阅读:42 2023-08-18 13:40:47 评论:0

我是 SpringBoot 的新手,我正在尝试通过 JPA(Hibernate) 对 mysql 进行 CRUD 访问

我关注了 https://spring.io/guides/gs/accessing-data-mysql/

当我用 Maven 编译它时,它成功地完成了,但是当我尝试从生成的 .jar 执行它时,它显示以下错误:

-(已编辑)现在提供以下堆栈跟踪:

TestSpringBoot\target>java -jar gs-mysql-data-0.1.0.jar 
 
.   ____          _            __ _ _ 
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \ 
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/  ___)| |_)| | | | | || (_| |  ) ) ) ) 
'  |____| .__|_| |_|_| |_\__, | / / / / 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::        (v2.0.3.RELEASE) 
 
2018-06-29 03:15:10 ERROR o.s.boot.SpringApplication - Application run failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException 
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1708) 
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:581) 
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503) 
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) 
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) 
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1089) 
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:859) 
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) 
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) 
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) 
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395) 
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) 
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) 
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) 
        at hello.Application.main(Application.java:10) 
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
        at java.base/java.lang.reflect.Method.invoke(Unknown Source) 
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) 
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException 
        at org.hibernate.boot.spi.XmlMappingBinderAccess.<init>(XmlMappingBinderAccess.java:43) 
        at org.hibernate.boot.MetadataSources.<init>(MetadataSources.java:86) 
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:212) 
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:167) 
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:51) 
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) 
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:390) 
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) 
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) 
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1767) 
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1704) 
        ... 24 common frames omitted 
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException 
        at java.base/java.net.URLClassLoader.findClass(Unknown Source) 
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source) 
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93) 
        at java.base/java.lang.ClassLoader.loadClass(Unknown Source) 
        ... 35 common frames omitted 

-POM:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
 
    <groupId>org.springframework</groupId> 
    <artifactId>gs-mysql-data</artifactId> 
    <version>0.1.0</version> 
 
    <parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>2.0.3.RELEASE</version> 
    </parent> 
 
    <dependencies> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-web</artifactId> 
        </dependency> 
 
        <!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) --> 
 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-data-jpa</artifactId> 
        </dependency> 
 
        <!-- Use MySQL Connector-J --> 
 
        <dependency> 
            <groupId>mysql</groupId> 
            <artifactId>mysql-connector-java</artifactId> 
        </dependency> 
 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-test</artifactId> 
            <scope>test</scope> 
        </dependency> 
        <dependency> 
            <groupId>org.hibernate</groupId> 
            <artifactId>hibernate-core</artifactId> 
            <version>5.3.1.Final</version> 
        </dependency> 
    </dependencies> 
 
    <properties> 
        <java.version>1.8</java.version> 
    </properties> 
 
    <build> 
        <plugins> 
            <plugin> 
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-maven-plugin</artifactId> 
            </plugin> 
        </plugins> 
    </build> 
 
</project> 

-代码:

@SpringBootApplication 
public class Application { 
public static void main(String[] args) { 
    SpringApplication.run(Application.class, args); 
} 
} 
 
@Controller     
@RequestMapping(path="/demo")  
Application path) 
public class MainController { 
@Autowired  
private UserRepository userRepository; 
@GetMapping(path="/add") 
public @ResponseBody String addNewUser (@RequestParam String name 
        , @RequestParam String email) { 
 
    User2 n = new User2(); 
    n.setName(name); 
    n.setEmail(email); 
    userRepository.save(n); 
    return "Saved"; 
} 
@GetMapping(path="/all") 
public @ResponseBody Iterable<User2> getAllUsers() { 
    // This returns a JSON or XML with the users 
    return userRepository.findAll(); 
} 
} 
 
@Entity  
public class User2 { 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer id; 
 
private String name; 
 
private String email; 
 
//getters and setters... 
 
} 
 
 
public interface UserRepository extends CrudRepository <User2, Long> { 
} 

Maven 控制台:

[INFO] Scanning for projects... 
[INFO]                                                                          
[INFO] ------------------------------------------------------------------------ 
[INFO] Building gs-mysql-data 0.1.0 
[INFO] ------------------------------------------------------------------------ 
[INFO]  
[INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ gs-mysql-data --- 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] Copying 1 resource 
[INFO] Copying 1 resource 
[INFO]  
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ gs-mysql-data --- 
[INFO] Changes detected - recompiling the module! 
[INFO] Compiling 4 source files to MyPath\TestSpringBoot\target\classes 
[INFO]  
[INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ gs-mysql-data --- 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] Copying 0 resource 
[INFO]  
[INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ gs-mysql-data --- 
[INFO] Changes detected - recompiling the module! 
[INFO] Compiling 1 source file to MyPath\TestSpringBoot\target\test-classes 
[INFO]  
[INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ gs-mysql-data --- 
[INFO]  
[INFO] ------------------------------------------------------- 
[INFO]  T E S T S 
[INFO] ------------------------------------------------------- 
[INFO]  
[INFO] Results: 
[INFO]  
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 
[INFO]  
[INFO]  
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ gs-mysql-data --- 
[INFO] Building jar: MyPath\TestSpringBoot\target\gs-mysql-data-0.1.0.jar 
[INFO]  
[INFO] --- spring-boot-maven-plugin:2.0.3.RELEASE:repackage (default) @ gs-mysql-data --- 
[INFO]  
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ gs-mysql-data --- 
[INFO] Installing MyPath\TestSpringBoot\target\gs-mysql-data-0.1.0.jar to MYPath\.m2\repository\org\springframework\gs-mysql-data\0.1.0\gs-mysql-data-0.1.0.jar 
[INFO] Installing MyPath\TestSpringBoot\pom.xml to MyPath\.m2\repository\org\springframework\gs-mysql-data\0.1.0\gs-mysql-data-0.1.0.pom 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 2.911 s 
[INFO] Finished at: 2018-06-29T02:01:08+02:00 
[INFO] Final Memory: 37M/325M 
[INFO] ------------------------------------------------------------------------ 

已解决:

正确的POM:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
 
    <groupId>org.springframework</groupId> 
    <artifactId>gs-mysql-data</artifactId> 
    <version>0.1.0</version> 
 
    <parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>2.0.3.RELEASE</version> 
    </parent> 
 
    <dependencies> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-web</artifactId> 
        </dependency> 
<!--PART ADDED TO SOLVE THE PROBLEM --> 
        <!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) --> 
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> 
        <dependency> 
            <groupId>org.hibernate</groupId> 
            <artifactId>hibernate-core</artifactId> 
            <version>5.2.3.Final</version> 
        </dependency> 
        <dependency> 
            <groupId>org.hibernate</groupId> 
            <artifactId>hibernate-entitymanager</artifactId> 
            <version>5.2.3.Final</version> 
        </dependency> 
 
        <dependency> 
            <groupId>javax.xml.bind</groupId> 
            <artifactId>jaxb-api</artifactId> 
            <version>2.3.0</version> 
        </dependency> 
 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-data-jpa</artifactId> 
        </dependency> 
 
        <!-- Use MySQL Connector-J --> 
 
        <dependency> 
            <groupId>mysql</groupId> 
            <artifactId>mysql-connector-java</artifactId> 
        </dependency> 
 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-test</artifactId> 
            <scope>test</scope> 
        </dependency> 
    </dependencies> 
 
    <properties> 
        <java.version>1.8</java.version> 
    </properties> 
 
    <build> 
        <plugins> 
            <plugin> 
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-maven-plugin</artifactId> 
            </plugin> 
        </plugins> 
    </build> 
 
</project> 

请您参考如下方法:

异常很明显,您的依赖项 pom.xml 缺少一些库 Hibernate-core,...

Caused by: java.lang.ClassNotFoundException: org.hibernate.boot.model.naming.PhysicalNamingStrategy

  • 请重新检查pom.xml

    <!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) --> 
     
     <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> 
     <dependency> 
        <groupId>org.hibernate</groupId> 
        <artifactId>hibernate-core</artifactId> 
        <version>5.3.1.Final</version> 
     </dependency> 
     
      <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager --> 
      <dependency> 
         <groupId>org.hibernate</groupId> 
         <artifactId>hibernate-entitymanager</artifactId> 
        <version>5.3.1.Final</version> 
     </dependency> 
     
    <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --> 
    <dependency> 
      <groupId>javax.xml.bind</groupId> 
      <artifactId>jaxb-api</artifactId> 
      <version>2.3.0</version> 
    </dependency> 
    


标签:Spring Boot
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号