首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot CRUD + Hibernate + JSP/JSON --不能把它们放在一起

Spring Boot CRUD + Hibernate + JSP/JSON --不能把它们放在一起
EN

Stack Overflow用户
提问于 2017-06-21 18:28:13
回答 1查看 469关注 0票数 1

在过去的三周里,我一直在尝试学习Spring,同时做了一些简单的练习,但即使在阅读了至少15篇不同的教程并阅读了许多StackOverflow答案之后,我仍然无法做到这一点:

我想制作一个“简单”的应用程序,它具有以下特点:

  • 当浏览到/carsweb时,能够使用带有一些css和js (在外部文件中)的JSP页面给出响应;
  • 在浏览到/carsjson时能够返回JSON。这一答复必须是实体“Car”的清单;
  • 当我们调用/newcar时,在DB上保存一辆新车(Car以JSON形式出现在请求体中);
  • 能够使用Hibernate从MySQL数据库中检索和保存Cars ( application.properties文件上的用户/密码);
  • 所有这些都仅使用Spring注释,如果可能的话,不使用XML进行配置。

我几乎什么都能做,但我不能把所有的东西都放在一起。以下是我目前的状况:

SpringBootWebApplication

代码语言:javascript
复制
@SpringBootApplication
public class SpringBootWebApplication extends SpringBootServletInitializer {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringBootWebApplication.class, args);
    }    
}

AppConfig

代码语言:javascript
复制
@Configuration
@ComponentScan(basePackages = "com.facundo")
public class AppConfig {

}

HibernateConfiguration

代码语言:javascript
复制
package com.facundo.configuration;

import java.util.Properties;

import javax.sql.DataSource;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.facundo.configuration" })
@PropertySource(value = { "classpath:application.properties" })
public class HibernateConfiguration {
    @Autowired
    private Environment environment;

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        return properties;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "com.mkyong.model" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
        dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
        dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
        dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
        return dataSource;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory s) {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(s);
        return txManager;
    }       
}

WelcomeController

代码语言:javascript
复制
@Controller
public class WelcomeController {
    @Autowired
    private CarService carService;
    @RequestMapping(value = "/carsweb", method = RequestMethod.GET)
    public String helloHtml(Model model) {
        return "welcome2";
    }

    @RequestMapping(path = "/newcar", method = RequestMethod.POST)
    public void postCustomer(@RequestBody Car modelo) {
        carService.save(modelo);
    }
}

CarDaoImpl

代码语言:javascript
复制
@Repository
public class CarDaoImpl implements CarDao{

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void save(Car modelo) {
        sessionFactory.getCurrentSession().persist(modelo);
    }        
}

CarPruebaImpl

代码语言:javascript
复制
@Service("prubaService")
@Transactional
public class CarPruebaImpl implements CarService{
    @Autowired
    private CarDao modeloDao;

    @Override
    public void save(Car modelo) {
        modeloDao.save(modelo);
    }
}

pom.xml

代码语言:javascript
复制
<?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>

    <artifactId>spring-boot-web-jsp</artifactId>
    <packaging>war</packaging>
    <name>Spring Boot Web JSP Example</name>
    <description>Spring Boot Web JSP Example</description>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!-- Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Web with Tomcat + Embed -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- JSTL -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <!-- Need this to compile JSP -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Need this to compile JSP -->
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- Optional, for bootstrap -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.3.7</version>
        </dependency>

        <!-- Persistencia -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>

        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- Joda-Time -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
        </dependency>

        <!-- To map JodaTime with database type -->
        <dependency>
            <groupId>org.jadira.usertype</groupId>
            <artifactId>usertype.core</artifactId>
            <version>3.0.0.CR1</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <!-- Package as an executable jar/war -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties:

代码语言:javascript
复制
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/websystique
jdbc.username = root
jdbc.password = MWtqKDeS4I
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = false
hibernate.format_sql = false

所以,当我执行

代码语言:javascript
复制
mvn spring-boot:run

在项目文件夹上:

org.springframework.beans.factory.UnsatisfiedDependencyException:错误创建名为‘BeanCreationException’的bean :取消通过‘servicioPrueba’字段表示的满意依赖;嵌套异常是org.springframework.beans.factory.Unsa tisfiedDependencyException:创建名为“carPruebaImpl”的bean时出错:通过fiel d‘modeloDao’表示的不满意依赖;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:错误创建名为‘carDaoImpl’的bean :通过字段‘sessionFactory’表示的不满意依赖;嵌套异常是创建名称为‘framework.beans.factory.BeanCreationException:’的bean (类路径中定义的'sessionFactory‘)的org.spring错误,init方法的urce com/facundo/configuration/HibernateConfiguration.class:调用失败;嵌套的异常是jav a.lang.AbstractMethodError。

我认为可以简化为:

创建名为“sessionFactory”的bean时出错

最后,我想说的是,我认为问题出在@ComponentScan找不到我的文件之类的配置中。

当然有很多需要改进的地方,所以如果你告诉我哪些地方真的有问题,请做。

不管怎样,先谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-22 17:13:53

所以这就是我所做的。

删除了整个配置包(不再有HibernateConfig.java和AppConfig.java)

pom.xml更改为只有:

代码语言:javascript
复制
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- JSTL -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <!-- Need this to compile JSP -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- Need this to compile JSP -->
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

并将application.properties更改为:

代码语言:javascript
复制
spring.datasource.url=jdbc:mysql://localhost:3306/arquitectura
spring.datasource.username=root
spring.datasource.password=MWtqKDeS4I
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE 

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

这现在起作用了,因为Springs starter-web在默认情况下已经配置为返回jsp和JSON (基于方法返回类型: JSP的字符串和JSON的ResponseEntity ),而且只要您只更改(在DAO类中),starter-jps还可以使用MySQL的所有内容。

代码语言:javascript
复制
@Autowired
private SessionFactory sessionFactory;

...

sessionFactory.getCurrentSession().persist(object);

代码语言:javascript
复制
@PersistenceContext
private EntityManager entityManager;

...

entityManager.persist(object);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44683621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档