Spring Lean BeanCurrentlyInCreationException: Ошибка при создании bean-компонента
Я пытаюсь следовать этому уроку по началу работы с Spring-lemon ( https://naturalprogrammer.gitbooks.io/spring-lemon-getting-started/content/index.html), но не могу идти дальше в определенный момент, Я создал новый весенний стартовый проект (Spring boot) и смог добавить к нему весенний лимон. Я не сделал ничего, кроме следования инструкциям, но когда я запустил сборку maven, тест не прошел со следующей ошибкой:
org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем 'lmnDemoController': не удалось выполнить внедрение зависимостей с автопроводкой; вложенным исключением является org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить метод: public void com.naturalprogrammer.spring.lemon.LemonController.setLemonService(com.naturalprogrammer.spring.lemon.LemonService); Вложенное исключение - org.springframework.beans.factory.BeanCurrentlyInCreationException: ошибка создания бина с именем 'lmnDemoService': бин с именем 'lmnDemoService' был внедрен в другие бины [authenticationSuccessHandler] в его исходной версии как часть циклической ссылки, но имеет в итоге был завернут. Это означает, что другие компоненты не используют окончательную версию компонента. Это часто является результатом чрезмерного совпадения типов - например, рассмотрите возможность использования getBeanNamesOfType с выключенным флагом allowEagerInit.
мой LmnDemoService.java
является:
package com.example;
import org.springframework.stereotype.Service;
import com.naturalprogrammer.spring.lemon.LemonService;
@Service
public class LmnDemoService extends LemonService<User, Long> {
@Override
protected User newUser() {
return new User();
}
}
В нем нет ничего, кроме строк в учебнике. Что мне не хватает?
РЕДАКТИРОВАТЬ:
LmndemoApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.naturalprogrammer.spring.lemon.LemonConfig;
@SpringBootApplication(scanBasePackageClasses = {LmndemoApplication.class, LemonConfig.class})
public class LmndemoApplication {
public static void main(String[] args) {
SpringApplication.run(LmndemoApplication.class, args);
}
}
LmnDemoController.java
package com.example;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.naturalprogrammer.spring.lemon.LemonController;
@RestController
@RequestMapping("/api/core")
public class LmnDemoController extends LemonController<User, Long> {
}
LmnDemoService.java
package com.example;
import org.springframework.stereotype.Service;
import com.naturalprogrammer.spring.lemon.LemonService;
@Service
public class LmnDemoService extends LemonService<User, Long> {
@Override
protected User newUser() {
return new User();
}
}
SecurityConfig.java
package com.example;
import org.springframework.context.annotation.Configuration;
import com.naturalprogrammer.spring.lemon.security.LemonSecurityConfig;
@Configuration
public class SecurityConfig extends LemonSecurityConfig {
}
ServletInitializer.java
package com.example;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(LmndemoApplication.class);
}
}
User.java
package com.example;
import javax.persistence.Entity;
import javax.persistence.Table;
import com.naturalprogrammer.spring.lemon.domain.AbstractUser;
@Entity
@Table(name="usr")
public class User extends AbstractUser<User,Long> {
private static final long serialVersionUID = 2716710947175132319L;
}
UserRepository.java
package com.example;
import com.naturalprogrammer.spring.lemon.domain.AbstractUserRepository;
public interface UserRepository extends AbstractUserRepository<User, Long> {
}
application.properties
#Database configuration
spring.jpa.database: MYSQL
spring.jpa.hibernate.ddl-auto: update
spring.datasource.url: jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username: myuser
spring.datasource.password: mypassword
#DevTools configuration
spring.devtools.livereload.enabled: false
spring.devtools.restart.enabled: false
#Application URL
#lemon.application-url: http://localhost:9000
#reCAPTCHA configuration
#lemon.recaptcha.sitekey: your google recaptcha site key
#lemon.recaptcha.secretkey: your google recaptcha secret key
#Remember me configuration
#lemon.remember-me-key: someSecret
#First administrator
lemon.admin.username: admin@example.com
lemon.admin.password: admin
#Email configuration
#spring.mail.host = smtp.gmail.com
#spring.mail.username = xxxxxx@gmail.com
#spring.mail.password = xxxxxx
#
#spring.mail.properties.mail.smtp.auth = true
#spring.mail.properties.mail.smtp.socketFactory.port = 465
#spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory
#spring.mail.properties.mail.smtp.socketFactory.fallback = false
#spring.mail.properties.mail.smtp.ssl.enable = true
#Handling cross origin requests configuration
#lemon.cors.allowed-origins: http://localhost:9000
#This will disable the protection against JSON vulnerability
#lemon.enabled.json-prefix: false
pom.xml
http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>lmndemo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring-lemon -->
<dependency>
<groupId>com.naturalprogrammer.spring</groupId>
<artifactId>spring-lemon</artifactId>
<version>0.8.5</version><!-- See https://github.com/naturalprogrammer/spring-lemon/releases for latest release -->
</dependency>
</dependencies>
<build>
<finalName>lmndemo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1 ответ
Выглядит как круговая ссылка. Это не происходит в моей среде, и я думаю, что в идеале Spring должен был бы быть в состоянии решить его сам, но лучше всего было бы исправить код Spring Lemon, чтобы сделать его более надежным, я думаю.
Итак, вы можете попробовать добавить @Lazy
аннотация на setLemonService
метод AuthenticationSuccessHandler
класс в проверенном коде Spring Lemon в вашей рабочей области? Сделайте так, как показано ниже:
@Autowired
@Lazy // add this line
public void setLemonService(LemonService<?, ?> lemonService) {
this.lemonService = lemonService;
}
Я не пробовала @Lazy
раньше, но я думаю, что это должно работать. Если нет, нам нужно подумать о другом способе разорвать круговую зависимость.
Дай мне знать. После того, как решение найдено, я проверю исправление в репозитории Spring Lemon.