webentwicklung-frage-antwort-db.com.de

Feld konnte im Frühjahr nicht automatisch angeschlossen werden. Warum?

Ich bekomme diesen Fehler immer wieder und kann nicht herausfinden, warum .. ja, ich weiß, dass viele Leute ähnliche Probleme hatten, aber das Lesen der Antworten, die sie erhalten haben, löst mein Problem nicht.

org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen der Bean mit dem Namen 'contactController': Die Injektion von autowired Abhängigkeiten ist fehlgeschlagen. geschachtelte Ausnahme ist org.springframework.beans.factory.BeanCreationException: Feld konnte nicht automatisch aktiviert werden: private net.service.ContactService net.controller.ContactController.contactService; Die verschachtelte Ausnahme ist org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine übereinstimmende Bean vom Typ [net.service.ContactService] für Abhängigkeit gefunden: Es wird mindestens eine Bean erwartet, die als autowire-Kandidat für diese Abhängigkeit qualifiziert ist. Anmerkungen zur Abhängigkeit: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

hier ist der Controller:

@Controller
@SessionAttributes
public class ContactController {

    @Autowired
    private ContactService contactService;
//methods...


}

das ContactServiceImpl

@Service("contactService")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ContactServiceImpl implements ContactService {

    @Autowired
    private ContactDao contactDao;

    public ContactServiceImpl() {
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
    public void addContact(Contact contact) {
        contactDao.saveContact(contact);
    }

    @Override
    public List<Contact> getContacts() {
        return contactDao.getAllContacts();
    }

}

das ContactDaoImpl

@Repository("contactDao")
public class ContactDaoImpl implements ContactDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void saveContact(Contact contact) {
        sessionFactory.getCurrentSession().saveOrUpdate(contact);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Contact> getAllContacts() {
        return (List<Contact>) sessionFactory.getCurrentSession().createQuery("from contact c").list();
    }

}

und das Spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:property-placeholder location="classpath:jdbc.properties" />
    <context:component-scan base-package="net.controller" />


    <tx:annotation-driven transaction-manager="hibernateTransactionManager" />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.user}" />
        <property name="password" value="${database.password}" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>net.form.Contact</value>
            </list>
        </property>


        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            </props>
        </property>
    </bean>

    <bean id="hibernateTransactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>
25
Sanyifejű

Im Frühling Servlet .xml:

<context:component-scan base-package="net.controller" />

(Ich nahm an, dass der Dienst impl im selben Paket wie die Dienstschnittstelle "net.service" ist).

Ich denke, Sie müssen das Paket net.service (oder alle von net) zum Komponentenscan hinzufügen. Momentan sucht spring nur in net.controller nach Komponenten und da Ihr Service impl im net.service ist, wird er bis zum Frühjahr nicht instanziiert.

34
Pyranja

Nun, es gibt ein Problem bei der Erstellung der ContactServiceImpl-Bean. Stellen Sie zunächst sicher, dass die Klasse tatsächlich instanziiert wird, indem Sie den No-Args-Konstruktor debuggen, wenn der Spring-Kontext initiiert wird und eine Instanz von ContactController erstellt wird.

Wenn die ContactServiceImpl tatsächlich durch den Spring-Kontext instanziiert wird, sie aber einfach nicht mit Ihrer @Autowire-Annotation abgeglichen wird, versuchen Sie, Ihre Annotationsinjektion genauer zu definieren. Hier ist ein Typ, der sich mit einem ähnlichen Problem befasst und einige mögliche Lösungen gibt:

http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/

Wenn Sie mich fragen, denke ich, dass es Ihnen gut geht, wenn Sie es ersetzen 

@Autowired
private ContactService contactService;

mit:

@Resource
@Qualifier("contactService")
private ContactService contactService;
9
Shivan Dragon

Ich habe diesen Fehler bekommen und die Suche danach führte mich hierher. Anscheinend bestand mein Fix einfach darin, @Component-Annotation zur Implementierung des abstrakten Services hinzuzufügen.

In diesem Fall würde das so aussehen:

import org.springframework.stereotype.Component;

...

@Component
public class ContactServiceImpl implements ContactService {
9
DKLEO

Wenn Sie diese Fehlermeldung erhalten, fehlt eine Anmerkung. Ich habe die @ Service-Anmerkung zu Service vermisst. Als ich diese Anmerkung hinzufügte, funktionierte es gut für mich.

5
bond

Ich habe heute vor demselben Problem gestanden. Es stellte sich heraus, dass ich vergessen habe, die @ Service/@ Component-Annotation für meine Service-Implementierungsdatei zu erwähnen, für die Spring nicht automatisch autowire kann und das Bean nicht erstellt wird. 

1

Ich hatte genau das gleiche Problem. Versuchen Sie, die beiden Klassen in dasselbe Paket zu packen und Zeile in der pom.xml hinzuzufügen 

<dependency> 
            <groupId> org.springframework.boot </groupId> 
            <artifactId> spring-boot-starter-web </artifactId> 
            <version> 1.2.0.RELEASE </version> 
</dependency>
0
Cheps

Stellen Sie sicher, dass Sie in der Java-Konfiguration Ihre Konfiguration in RootConfig wie folgt importiert haben. @Import (PersistenceJPAConfig.class)

0
laudukang