2014-12-27 10 views
5

ho lavorato attraverso il seguente tutorial:IllegalStateException - @ComponentScanning un pacchetto Spring Framework

http://spring.io/guides/gs/rest-service/

Inizialmente sono stato in grado di ottenere il codice per funzionare correttamente (Eseguire il tutorial finito, inviare un messaggio HTTP e ottenere la risposta corretta) e ampliare con successo su di esso.

Dopo l'ulteriore espansione, mi sono imbattuto nel seguente eccezione:

java.lang.IllegalStateException: Could not evaluate condition on org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer due to internal class not found. This can happen if you are @ComponentScanning a springframework package (e.g. if you put a @ComponentScan in the default package by mistake) 
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:51) 
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:92) 
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:174) 
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:136) 
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:116) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:330) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94) 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:611) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:961) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) 
    at com.aharrison.hello.Application.main(Application.java:15) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 

allora ho messo a nudo il codice di nuovo verso il basso per solo ciò che viene mostrato nell'esempio, ma sto ancora vivendo l'eccezione.

penso che potrebbe essere correlato al problema descritto di seguito, anche se è contrassegnato come chiuso:

https://github.com/spring-projects/spring-boot/issues/2050

Io non sono molto esperto con la Primavera, quindi non posso pienamente comprendere ciò che è essere discusso.

Qui sono le mie classi attuali:

Greeting.java:

package com.aharrison.hello; 

public class Greeting { 
    private final long id; 
    private final String content; 

    public Greeting(long id, String content) { 
     this.id = id; 
     this.content = content; 
    } 

    public long getId() { 
     return id; 
    } 

    public String getContent() { 
     return content; 
    } 
} 

GreetingController:

package com.aharrison.hello; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

import java.util.concurrent.atomic.AtomicLong; 

@RestController 
public class GreetingController { 
    private static final String template = "Hello, %s!"; 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/greeting") 
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { 
     return new Greeting(counter.incrementAndGet(), String.format(template, name)); 
    } 
} 

Application.java:

package com.aharrison.hello; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.annotation.ComponentScan; 

/** 
* Created by Adam on 12/26/2014. 
*/ 
@ComponentScan 
@EnableAutoConfiguration 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

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> 

<groupId>com.aharrison</groupId> 
<artifactId>SpringRestAPI</artifactId> 
<version>1.0-SNAPSHOT</version> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <version>1.2.0.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>4.1.3.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.data</groupId> 
     <artifactId>spring-data-mongodb</artifactId> 
     <version>1.6.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.mongodb</groupId> 
     <artifactId>mongo-java-driver</artifactId> 
     <version>2.12.2</version> 
    </dependency> 
</dependencies> 

Domande:

  1. cosa sta causando l'eccezione in questa situazione? C'è qualcosa di sbagliato nel mio codice sopra, o il problema è correlato all'ambiente?
  2. Quando l'eccezione dice "..se si mette un @ComponentScan nel pacchetto predefinito per errore", che è il pacchetto predefinito a cui si riferisce? È applicabile alla situazione attuale?

Grazie in anticipo.

+0

[controllare questo collegamento] (http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-build-systems) questo documento ha una chiara spiegazione su come configurare la molla applicazione di avvio usando Maven. –

+0

Apparentemente questa domanda continua a ottenere traffico. Onestamente non ho lavorato su ciò che ha portato a questo problema da anni. Non ho mai accettato una risposta perché non ho trovato una soluzione; fammi sapere se questa è una brutta forma. Buona fortuna a tutti. –

risposta

2

Quando eseguo il codice che hai fornito, tutto funziona correttamente. L'unico cambiamento che ho dovuto fare è stato nel pom.xml in cui ho aggiunto il seguente:

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

In questo modo l'intera Primavera Boot meccanismo ed è necessaria per poter essere in grado di avviare l'applicazione.

Vedere sotto per l'uscita di successo dal mio test:

. ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::  (v1.2.0.RELEASE) 

2014-12-27 17:41:12.472 INFO 4065 --- [   main] com.aharrison.hello.Application   : Starting Application on My-MacBook-Pro.local with PID 4065 (/Users/wassgren/test/target/test-classes started by wassgren in /Users/wassgren/test/test-di) 
2014-12-27 17:41:12.506 INFO 4065 --- [   main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]4a668b6e: startup date [Sat Dec 27 17:41:12 CET 2014]; root of context hierarchy 
2014-12-27 17:41:13.407 INFO 4065 --- [   main] o.s.b.f.s.DefaultListableBeanFactory  : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]] 
2014-12-27 17:41:14.186 INFO 4065 --- [   main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration' of type [class org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
2014-12-27 17:41:14.703 INFO 4065 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080/http 
2014-12-27 17:41:15.047 INFO 4065 --- [   main] o.apache.catalina.core.StandardService : Starting service Tomcat 
2014-12-27 17:41:15.048 INFO 4065 --- [   main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.15 
2014-12-27 17:41:15.154 INFO 4065 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]  : Initializing Spring embedded WebApplicationContext 
2014-12-27 17:41:15.154 INFO 4065 --- [ost-startStop-1] o.s.web.context.ContextLoader   : Root WebApplicationContext: initialization completed in 2651 ms 
2014-12-27 17:41:16.399 INFO 4065 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/] 
2014-12-27 17:41:16.404 INFO 4065 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 
2014-12-27 17:41:16.404 INFO 4065 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 
2014-12-27 17:41:16.907 INFO 4065 --- [   main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot[email protected]4a668b6e: startup date [Sat Dec 27 17:41:12 CET 2014]; root of context hierarchy 
2014-12-27 17:41:16.979 INFO 4065 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/greeting],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public com.aharrison.hello.Greeting com.aharrison.hello.GreetingController.greeting(java.lang.String) 
2014-12-27 17:41:16.981 INFO 4065 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 
2014-12-27 17:41:16.981 INFO 4065 --- [   main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest) 
2014-12-27 17:41:17.013 INFO 4065 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2014-12-27 17:41:17.014 INFO 4065 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2014-12-27 17:41:17.059 INFO 4065 --- [   main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 
2014-12-27 17:41:17.206 INFO 4065 --- [   main] o.s.j.e.a.AnnotationMBeanExporter  : Registering beans for JMX exposure on startup 
2014-12-27 17:41:17.292 INFO 4065 --- [   main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http 
2014-12-27 17:41:17.294 INFO 4065 --- [   main] com.aharrison.hello.Application   : Started Application in 5.245 seconds (JVM running for 6.088) 
+0

Grazie per la tua risposta! Ho aggiunto la dipendenza e sto ancora riscontrando problemi. Dopo aver confrontato l'output della mia applicazione con la tua, esito negativo subito dopo il secondo messaggio: "ationConfigEmbeddedWebApplicationContext". Invece, ottengo il seguente: "2014-12-27 16: 09: 44.528 INFO 880 --- [main] .blClasspathLoggingApplicationListener: Impossibile avviare l'applicazione con classpath:" \ n "2014-12- 27 16: 09: 44.541 ERRORE 880 --- [main] osboot.SpringApplication: avvio dell'applicazione non riuscito "\ n Seguito dall'eccezione pubblicata sopra. –

0

Primavera Boot 1.2.2 è stato rilasciato, consiglierei di eseguire l'aggiornamento alla nuova versione in quanto viene fornito con un numero significativo di correzioni. Inoltre usa la sicurezza della molla 3.2.6. Dovresti stare molto attento quando dichiari dipendenze override o diverse rispetto a quelle che vengono per default, dato che l'avvio arriva già con la maggior parte di esso. Ho avuto lo stesso problema con l'uso della molla 1.2.2 con spring security 3.2.5 ma quando sono tornato al boot 1.2.1 era tutto a posto.

1

Rimuovere @ComponentScan che si trova sopra la classe Application. @SpringBootApplication lo aggiunge per impostazione predefinita, se le classi che devono essere scansionate si trovano nello stesso pacchetto della classe Application.

Problemi correlati