在过去的三周里,我一直在尝试学习Spring,同时做了一些简单的练习,但即使在阅读了至少15篇不同的教程并阅读了许多StackOverflow答案之后,我仍然无法做到这一点:
我想制作一个“简单”的应用程序,它具有以下特点:
/carsweb时,能够使用带有一些css和js (在外部文件中)的JSP页面给出响应;/carsjson时能够返回JSON。这一答复必须是实体“Car”的清单;/newcar时,在DB上保存一辆新车(Car以JSON形式出现在请求体中);application.properties文件上的用户/密码);我几乎什么都能做,但我不能把所有的东西都放在一起。以下是我目前的状况:

SpringBootWebApplication
@SpringBootApplication
public class SpringBootWebApplication extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootWebApplication.class, args);
}
}AppConfig
@Configuration
@ComponentScan(basePackages = "com.facundo")
public class AppConfig {
}HibernateConfiguration
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
@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
@Repository
public class CarDaoImpl implements CarDao{
@Autowired
private SessionFactory sessionFactory;
@Override
public void save(Car modelo) {
sessionFactory.getCurrentSession().persist(modelo);
}
}CarPruebaImpl
@Service("prubaService")
@Transactional
public class CarPruebaImpl implements CarService{
@Autowired
private CarDao modeloDao;
@Override
public void save(Car modelo) {
modeloDao.save(modelo);
}
}pom.xml
<?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:
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所以,当我执行
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找不到我的文件之类的配置中。
当然有很多需要改进的地方,所以如果你告诉我哪些地方真的有问题,请做。
不管怎样,先谢谢你。
发布于 2017-06-22 17:13:53
所以这就是我所做的。
删除了整个配置包(不再有HibernateConfig.java和AppConfig.java)
将pom.xml更改为只有:
<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更改为:
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的所有内容。
@Autowired
private SessionFactory sessionFactory;
...
sessionFactory.getCurrentSession().persist(object);至
@PersistenceContext
private EntityManager entityManager;
...
entityManager.persist(object);https://stackoverflow.com/questions/44683621
复制相似问题