2017-06-21 3 views
1

Ich habe versucht, Frühling für die letzten drei Wochen zu lernen, während Sie ein paar einfache Übung, aber auch nach dem Lesen von mindestens 15 verschiedenen Tutorials und Lesen ich habe eine Menge Stackoverflow Antworten kann diese Arbeit nicht machen:Spring Boot CRUD + Hibernate + JSP/JSON - Kann nicht alles zusammen

ich mag einen ‚einfachen‘ Antrag stellen, die folgenden Merkmale aufweist:

  • die Lage sein, eine Antwort mit einer JSP-Seite mit einigen CSS zu geben und js (in externen Dateien) beim Browsen zu /carsweb;
  • Sie können einen JSON zurückgeben, wenn Sie zu /carsjson navigieren. Diese Antwort muss eine Liste von Entitäten "Auto" sein;
  • Speichern Sie ein neues Auto auf DB, wenn wir /newcar anrufen (Auto kommt als JSON im Anfragekörper);
  • Abrufen und Speichern von Autos aus einer MySQL-Datenbank mit Hibernate (Benutzer/Passwort auf application.properties Datei);
  • All dies nur mit Spring Annotationen, wenn möglich kein XML für die Konfiguration.

Ich kann so ziemlich alles machen, aber ich kann nicht alles zusammensetzen. Hier ist der aktuelle Zustand Ich bin an:

Source Packages

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> 

Anwendung.Eigenschaften:

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 

Also, das ist der Fehler, der zeigt, wenn i

mvn spring-boot:run 

auf Projektordner ausführen:

BeanCreationException: org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler beim Erstellen der Bean mit dem Namen 'welcomeController': Uns atisfied Abhängigkeit ausgedrückt durch Feld 'servicioPrueba'; verschachtelte Ausnahme ist org.springframework.beans.factory.Unsa TisfiedDependencyException: Fehler beim Erstellen Bean mit dem Namen "CarPruebaImpl": Unzufriedene Abhängigkeit ausgedrückt durch Feld d 'ModeloDao'; verschachtelte Ausnahme ist org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler beim Erstellen der Bean mit dem Namen "carDaoImpl": Unzufriedene Abhängigkeit ausgedrückt durch Feld 'sessionFactory'; verschachtelte Ausnahme ist org.spring framework.beans.factory.BeanCreationException: Fehler beim Erstellen Bean mit Name 'SessionFactory' in Klassenpfad definiert Reso urce [com/Facundo/Konfiguration/HibernateConfiguration.class]: Aufruf der Init-Methode fehlgeschlagen; verschachtelte Ausnahme ist jav a.lang.AbstractMethodError

Was ich denken kann, zu reduzieren:

mit dem Namen 'session'

Schließlich Bohne Schaffung

Fehler, ich möchte sagen, Ich denke, dass das Problem in einer Konfiguration ist, in der @ComponentScan meine Dateien oder ähnliches nicht findet.
Sicher gibt es eine Menge zu verbessern, also wenn Sie mir sagen, welche Teile wirklich falsch sind, tun Sie es bitte.
Wie auch immer, danke im Voraus.

+0

Versuchen Sie folgendes: Bewegen Sie die 'SpringBootWebApplication' Klasse außerhalb des Pakets, um auf dem root-Paket Ihrer Anwendung zu sein. Es ist nicht notwendig, eine "AppConfig" und "HibernateConfiguration" zu haben, sie zu einer Konfigurationsklasse zusammenzufassen und sie zusammen mit der SpringBootWebApplication-Klasse außerhalb des Pakets zu verschieben, damit sie sich im Root-Paket befindet.In Ihrer neuen Konfigurationsklasse muss "@ ComponentScan" nicht hinzugefügt werden, da "@ SpringBootApplication" dies bereits enthält. –

Antwort

0

Also, das ist was ich getan habe.

entfernt gesamten Konfigurationspaket (nicht mehr HibernateConfig.java und AppConfig.java)

Changed pom.xml nur haben:

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

Und geändert application.properties zu:

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 

Dies funktioniert jetzt, weil Springs Starter-Web bereits c ist onfigured standardmäßig jsp und JSON zurück (basierend auf Methode Rückgabetyp: String für JSP und ResponseEntity für JSON) und Starter-JPS auch alles mit MySQL arbeiten muss, wenn Sie (in Klassen DAO) ändern

@Autowired 
private SessionFactory sessionFactory; 

... 

sessionFactory.getCurrentSession().persist(object); 

zu

@PersistenceContext 
private EntityManager entityManager; 

... 

entityManager.persist(object); 
Verwandte Themen