2017-01-17 6 views
-1

Я хочу запустить приложение Spring Boot со встроенным Tomcat и создать базу данных во время выполнения.Впрыскивание зависимых от автозапуска не удалось в приложении springboot

Я написал следующее application.properties файл:

server.port=1111 
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect 
spring.jpa.hibernate.ddl-auto=update 
spring.datasource.driverClassName=com.mysql.jdbc.Driver 
spring.datasource.url=jdbc:mysql://localhost:3306/spring-boot 
spring.datasource.username=root 
spring.datasource.password= 

Это мой основной класс:

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@Configuration 
@EnableAutoConfiguration 
@ComponentScan("ma.mahmoud.springboot") 
public class Application { 
    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 
} 

Для DAO я использую Spring Data, поэтому я создал следующий интерфейс:

public interface PlaceRepository extends CrudRepository<Place, Long> { 

Place findByShortName(String shortName); 
} 

Это интерфейс, который я написал для моего пользования:

public interface PlaceService { 
    Place getPlaceByShortName(String shortName); 
} 

И реализация этой услуги, как это:

@Service 
public class PlaceServiceImpl implements PlaceService { 

    @Autowired 
    private PlaceRepository placeRepository; 


    public Place getPlaceByShortName(String shortName) { 
     return placeRepository.findByShortName(shortName); 
    } 

    // GETTERS AND SETTERS 
} 

Изначально мое приложение бросает следующую ошибку при запуске:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private ma.mahmoud.springboot.repository.PlaceRepository ma.mahmoud.springboot.service.impl.PlaceServiceImpl.placeRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [ma.mahmoud.springboot.repository.PlaceRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

EDIT

Однако , после замены аннотаций на мой основной класс на @SpringBootApplication и путем коррекции spring.jpa.database-platform к org.hibernate.dialect.MySQL5Dialect, я получил следующее сообщение об ошибке:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.springframework.core.convert.support.DefaultConversionService.addCollectionConverters(Lorg/springframework/core/convert/converter/ConverterRegistry;)V from class org.springframework.boot.bind.RelaxedConversionService 

Я использую следующий pom.xml:

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

<properties> 
    <hibernate.version>5.0.3.Final</hibernate.version> 
    <spring.version>4.2.2.RELEASE</spring.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>javax.persistence</groupId> 
     <artifactId>persistence-api</artifactId> 
     <version>1.0.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-collections4</artifactId> 
     <version>4.0</version> 
    </dependency> 
</dependencies> 

Я не использую любой конфигурации XML для Spring, так как я использовать аннотации. Я что-то забыл? Или мне нужна еще одна аннотация, чтобы заставить ее работать?

+0

Является ли 'PlaceRepository' аннотированным как хранилище? – Jens

+0

Я пробовал, но он не работает – Mahmoud

+0

Он должен работать, если интерфейс находится в пакете 'ma.mahmoud.springboot', и добавлена ​​аннотация @Repository. – Jens

ответ

-2

1.Add кто-нибудь из @Component аннотаций в классе PlaceRepository Impelmentation.

2.Make уверены ли пакет PlaceRepository & его реализации будут добавлены в @ComponentScan

+0

У меня нет реализации для PlaceRepository, я использую SpringData и все методы делают CRUD то есть в CrudRepository. – Mahmoud

+0

@ downvoters, пожалуйста, оставьте комментарий. Привет Махмуд, Без класса реализации, как вы можете создать bean-компонент для этого интерфейса? Ваша попытка в эквиваленте создать новый экземпляр для интерфейса с использованием нового оператора, что невозможно без класса class/anoymous для этого интерфейса. –

+0

Он использует Spring Data JPA, так что будет заботиться о создании бина. Если вы не знаете эту структуру, прочитайте ее, прежде чем давать ложные ответы. Даунвиты оправданы. – dunni

0

Попробуйте добавить @EnableJpaRepositories("package") на верхней части Application класса.

+0

Это не обязательно, потому что '@ EnableAutoConfiguration' добавит' @ EnableJpaRepositories'. – g00glen00b

+0

Я лично использую все '@ComponentScan (" package ")', '@EntityScan (" pckg ")', '@EnableJpaRepositories (" pckg ")', '@ SpringBootApplication', потому что у меня есть многомодульный проект, без указания всего, это не сработает. –

2

Код выглядит правильно, однако на ваш диалект нет. Первоначально вы установили PostgreSQLDialect для базы данных MySQL, но теперь вы заменили его на MYSQLDialect, который не является допустимым диалектом.

Таким образом, вы, вероятно, следует использовать:

spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect 

Или, если вы используете MySQL 5.x < вы должны использовать:

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect 

"Y" в MySQL должна быть строчными в обоих случаях.Полный список всех диалектов можно найти в Hibernate documentation. Однако диалект не является обязательным в большинстве случаев, поэтому вы можете попытаться удалить свойство spring.jpa.database-platform.

Чтобы ответить на ваш отредактированный вопрос, у вас возникла несогласованность между версией загрузки Spring и Spring. Если у вас нет каких-либо оснований для изменения версии Spring (или даже версию Hibernate), вы, вероятно, не сделать это, вы должны удалить следующие строки из вашего pom.xml:

<hibernate.version>5.0.3.Final</hibernate.version> 
<spring.version>4.2.2.RELEASE</spring.version> 
+0

thunks для вашей учетной записи, но это не проблема – Mahmoud

+0

@Mahmoud не забудьте обновить код в своем вопросе, чтобы он содержал ваш текущий код, и покажите нам ошибку при использовании '@ SpringBootApplication'. Если вы получаете некоторую ошибку из-за неправильных версий, это может быть причиной. Сейчас этот код ** должен работать **. – g00glen00b

+0

i Отредактировал мой вопрос – Mahmoud

0

вы не нужно указывать диалект. У меня есть подобное приложение, и после это мой application.properties файл

spring.datasource.url = jdbc:mysql://localhost:3306/[db_name] 
spring.datasource.username = root 
spring.datasource.password = 
spring.jpa.hibernate.ddl-auto=update[or "create-drop" if you want the tables created] 
spring.jpa.show-sql=true 

Попробуйте

Смежные вопросы