@ স্বীকৃত - নির্ভরতার জন্য কোনও প্রকারের কোয়ালিফাইং শিম পাওয়া যায় নি


90

আমি স্প্রিং এবং হাইবারনেট ব্যবহার করে পরিষেবাগুলির সত্তা, পরিষেবা এবং JUnit পরীক্ষা তৈরি করে আমার প্রকল্পটি শুরু করেছি। এই সব দুর্দান্ত কাজ করে। তারপরে আমি অনেকগুলি বিভিন্ন ধাপে ধাপে টিউটোরিয়াল ব্যবহার করে এই ওয়েব অ্যাপ্লিকেশনটি তৈরি করতে বসন্ত-এমভিসি যুক্ত করেছি, কিন্তু যখন আমি @ অটোভায়ার্ড টীকাগুলি দিয়ে কন্ট্রোলার তৈরি করার চেষ্টা করছি তখন মোতায়েনের সময় গ্লাস ফিশ থেকে ত্রুটিগুলি পাচ্ছি। আমি অনুমান করি যে কোনও কারণে স্প্রিং আমার পরিষেবাগুলি দেখতে পাচ্ছে না, তবে অনেক চেষ্টা করার পরেও আমি এটি পরিচালনা করতে পারি না।

সাথে পরিষেবাগুলির জন্য পরীক্ষা

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml"})

এবং

@Autowired
MailManager mailManager;

সঠিকভাবে কাজ করে।

@ অটোভায়ার্ড ছাড়াও কন্ট্রোলাররা, আমি কোনও সমস্যা ছাড়াই ওয়েব ব্রাউজারে আমার প্রকল্পটি খুলতে পারি।

/src/main/resources/beans.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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-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/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">

    <context:property-placeholder location="jdbc.properties" />

    <context:component-scan base-package="pl.com.radzikowski.webmail">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <!--<context:component-scan base-package="pl.com.radzikowski.webmail.service" />-->

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <!-- Persistance Unit Manager for persistance options managing -->
    <bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="defaultDataSource" ref="dataSource"/>
    </bean>

    <!-- Entity Manager Factory for creating/updating DB schema based on persistence files and entity classes -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitManager" ref="persistenceUnitManager"/>
        <property name="persistenceUnitName" value="WebMailPU"/>
    </bean>

    <!-- Hibernate Session Factory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--<property name="schemaUpdate" value="true" />-->
        <property name="packagesToScan" value="pl.com.radzikowski.webmail.domain" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            </props>
        </property>
    </bean>

    <!-- Hibernate Transaction Manager -->
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!-- Activates annotation based transaction management -->
    <tx:annotation-driven transaction-manager="txManager"/>

</beans>

/webapp/WEB-INF/web.xML

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Spring Web MVC Application</display-name>
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

/webapp/WEB-INF/mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

pl.com.radzikowski.webmail.service.AbstractManager

package pl.com.radzikowski.webmail.service;

import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Master Manager class providing basic fields for services.
 * @author Maciej Radzikowski <maciej@radzikowski.com.pl>
 */
public class AbstractManager {

    @Autowired
    protected SessionFactory sessionFactory;

    protected final Logger logger = Logger.getLogger(this.getClass());

}

pl.com.radzikowski.webmail.service.MailManager

package pl.com.radzikowski.webmail.service;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
@Transactional
public class MailManager extends AbstractManager {
    // some methods...
}

pl.com.radzikowski.webmail.HomeController

package pl.com.radzikowski.webmail.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import pl.com.radzikowski.webmail.service.MailManager;

@Controller
@RequestMapping("/")
public class HomeController {

    @Autowired
    public MailManager mailManager;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String homepage(ModelMap model) {
        return "homepage";
    }

}

ত্রুটি:

SEVERE:   Exception while loading the app
SEVERE:   Undeployment failed for context /WebMail
SEVERE:   Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public pl.com.radzikowski.webmail.service.MailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.com.radzikowski.webmail.service.MailManager] 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)}

প্রচুর কোডের জন্য দুঃখিত, তবে কী কারণে সেই ত্রুটিটি আর হতে পারে তা আমি জানি না।

যুক্ত হয়েছে

আমি ইন্টারফেস তৈরি করেছি:

@Component
public interface IMailManager {

যুক্ত সরঞ্জামসমূহ:

@Component
@Transactional
public class MailManager extends AbstractManager implements IMailManager {

এবং স্বতঃপ্রযুক্তি পরিবর্তিত হয়েছে:

@Autowired
public IMailManager mailManager;

তবে এটি ত্রুটিগুলি ছুঁড়ে ফেলেছে (যখন আমি @ কোয়ালিফায়ার দিয়ে চেষ্টা করেছি)

.. ক্ষেত্রটি স্বতঃশক্তিযুক্ত করা উচিত নয়: সর্বজনীন pl.com.radzikowski.webmail.service.IMailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager ...

আমি @ কম্পোনেন্ট এবং @ ট্রান্সজেকশনালের বিভিন্ন সংমিশ্রণ দিয়ে চেষ্টা করেছি।

আমি কি কোনওভাবে ওয়েব.এক্সএমএলে beans.xml অন্তর্ভুক্ত করব না?


আপনি কীভাবে বিনস.এক্সএমএল লোড করছেন?
মাইকেল উইলস

এখন কিভাবে সম্পর্কে মাত্র এক ত্যাগ করার MailManagerInterfaceএবং IMailManager? :)
প্যাটিসন

দুঃখিত, আমি কোডটি খারাপভাবে পেস্ট করেছি। আমার প্রোগ্রামে IMailManagerসর্বত্র আছে।
রাডজিকোভস্কি

আহ, ঠিক .. যোগ <import resource="classpath:/beans.xml"/>করুনmvc-dispatcher-servlet.xml
প্যাটিসন

যাইহোক, আপনি কি এমএম সিদ্ধান্ত নেওয়ার চেষ্টা করেছেন?
প্যাটিসন

উত্তর:


81

আপনার AbstractManagerক্লাসের পরিবর্তে ইন্টারফেসটি স্বতঃপাদন করা উচিত MailManager। আপনার যদি বিভিন্ন প্রয়োগ থাকে তবে AbstractManagerআপনি লিখতে পারেন @Component("mailService")এবং @Autowired @Qualifier("mailService")নির্দিষ্ট শ্রেণীর স্বাবলম্বনের সাথে সংমিশ্রণ করতে পারেন।

এটি স্প্রিং ইন্টারফেসের উপর ভিত্তি করে প্রক্সি অবজেক্ট তৈরি এবং ব্যবহার করে এ কারণে এটি ঘটে।


4
আপনাকে ধন্যবাদ তবে এটি এখনও কাজ করে না (একই ত্রুটি)। আমি পোস্টে পরিবর্তনগুলি যুক্ত করেছি। হয়তো আমি আমার প্রকল্পের মধ্যে সঠিকভাবে কিছু অন্তর্ভুক্ত / অনুসন্ধান করি না?
রাদজিকোভস্কি

আমি ভাবছি যে এরকম কিছু করার উপায় আছে @Autowired AbstractManager[] abstractManagersযাতে এর সমস্ত বাস্তবায়ন থাকে।
ওওএলএফপিডব্লিউএনআর

@ ওওএলএফপিডব্লিউএনইআর আপনার লেখার মতো কাজ করা উচিত। লিঙ্কটি
প্যাটিসন

কেন হবে না MailManager?
অ্যালেক্স 78191

আমি @Serviceএকই ইন্টারফেস বাস্তবায়ন দুটি ক্লাস। দুজনই @Autowiredঅন্য ক্লাসে। প্রাথমিকভাবে এটি নির্দিষ্ট পোস্টের মতো একই সমস্যার সৃষ্টি করেছিল যখন আমি নির্দিষ্ট শ্রেণীর ধরণ ব্যবহার করি। এই উত্তরটি পর আমি বিভিন্ন সঙ্গে ইন্টারফেস টাইপ ব্যবহার পরিবর্তিত @Qualifier("myServiceA")এবং @Qualifier("myServiceB")এবং সমস্যাটি সমাধান হয়েছে। ধন্যবাদ!
xialin

27

আমার এটি ঘটেছে কারণ আমার পরীক্ষাগুলি আমার উপাদানগুলির মতো একই প্যাকেজে ছিল না। (আমি আমার উপাদান প্যাকেজটির নামকরণ করেছি, তবে আমার পরীক্ষার প্যাকেজটি নয়)) এবং আমি @ComponentScanআমার পরীক্ষার @Configurationক্লাসে ব্যবহার করছিলাম , সুতরাং আমার পরীক্ষাগুলি তারা যে উপাদানগুলির উপর নির্ভর করেছিল সেগুলি খুঁজে পাচ্ছিল না।

সুতরাং, আপনি যদি এই ত্রুটিটি পান তবে ডাবল পরীক্ষা করে দেখুন।


4
এটি আমার পক্ষে কাজ করেছে। আমার পরীক্ষাগুলি ব্যর্থ হয়েছিল যখন আমি কোনও নতুন প্যাকেজের নামে সরে যাওয়ার কোডটি রিফ্যাক্টর করেছি কারণ আমি @Comp घटकScan- এ পুরানো প্যাকেজটির নামটি ব্যবহার করছি।
বিজয় ভেকাকোমা

4
কিভাবে ব্যবহার @Configurationথেকে বর্গ src/mainমধ্যে src/test?
অ্যালেক্স 78191

10

জিনিসটি হ'ল অ্যাপ্লিকেশন প্রসঙ্গ এবং ওয়েব অ্যাপ্লিকেশন প্রসঙ্গে উভয়ই সার্ভার শুরুর সময় ওয়েব অ্যাপ্লিকেশন কনটেক্সটে নিবন্ধিত হয়। আপনি যখন পরীক্ষা চালাবেন আপনাকে অবশ্যই স্পষ্টভাবে বলতে হবে কোন প্রসঙ্গটি বোঝা উচিত।

এটা চেষ্টা কর:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/beans.xml", "/mvc-dispatcher-servlet.xml"})

4
যদি একটি স্প্রিং বুট ব্যবহার করছি তবে এটি কীভাবে করবেন?
Alex78191

আমি মাভেন নির্ভরতাগুলির জন্য উপাদান স্ক্যানটি কনফিগার করা এবং বছরের সাথে একবার এর মতো লড়াইয়ের কথা ভুলে যাই।
বি

আপনি যদি নিজেই অ্যাপ্লিকেশনটির কথা এবং ইন্টিগ্রেশন টেস্ট না নিয়ে কথা বলছেন, স্প্রিং বুটের জন্য আপনি এটি এটি করতে পারেন: @SpringBootApplication(scanBasePackages = { "com.package.one", "com.package.two" })
বি

5

এই সাথে আমার অনেক সময় ব্যয়! আমার খারাপ! পরে দেখা গেছে যে ক্লাসে আমি টিকাটি ঘোষনা করেছি Serviceবা Componentটাইপ বিমূর্ত ছিল। স্প্রিংফ্রেমে ওয়ার্কে ডিবাগ লগ সক্ষম করেছে কিন্তু কোনও ইঙ্গিত পাওয়া যায়নি। ক্লাসটি যদি বিমূর্তের প্রকারের হয় তবে তা পরীক্ষা করে দেখুন। তারপরে, বেসিক বিধিটি প্রয়োগ হয়েছে, কোনও বিমূর্ত শ্রেণিকে তাত্পর্যপূর্ণ করতে পারে না।


4
আপনি আমার দিন বাঁচিয়েছেন স্যার, এটি সনাক্ত করা এত কঠিন!
জাপেথ ওঙ্গেরি -

4

আমার জার ফাইলের একটি থেকে অটো-ওয়্যারিংয়ের সময় আমি একই সমস্যার মুখোমুখি ছিলাম। আমি @ অলস টীকাগুলি ব্যবহার করে সমস্যার সমাধান করেছি:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;

    @Autowired
    @Lazy
    private IGalaxyCommand iGalaxyCommand;


3

আপনি কি কেবলমাত্র নিজের কংক্রিটের প্রয়োগের সাথে এ্যানোটেট করার চেষ্টা করতে পারেন @Component? সম্ভবত নিম্নলিখিত উত্তরটি সাহায্য করতে পারে। এটি একই ধরণের সমস্যা। আমি সাধারণত প্রয়োগের ক্লাসগুলিতে স্প্রিং টীকাগুলি রাখি।

https://stackoverflow.com/a/10322456/2619091


2

ম্যাক্সের পরামর্শ অনুসারে অ্যাবস্ট্রাক্ট ম্যানেজারের সঠিক উপায় হ'ল এটি সঠিকভাবে কাজ করা উচিত।

@Autowired
@Qualifier(value="mailService")
public MailManager mailManager;

এবং

@Component("mailService")
@Transactional
public class MailManager extends AbstractManager {
}

2

আমি সম্প্রতি এটিতে ছুটে এসেছি, এবং এটি যেমন পরিণত হয়েছে, আমি আমার পরিষেবা শ্রেণিতে ভুল টিকাটি আমদানি করেছি। নেটবিনের আমদানি বিবরণীগুলি আড়াল করার একটি বিকল্প রয়েছে, সে কারণেই আমি এটি কিছু সময়ের জন্য দেখিনি।

আমি @org.jvnet.hk2.annotations.Serviceপরিবর্তে ব্যবহার করেছি @org.springframework.stereotype.Service


1
  • একটি কারণ বিন্যান প্রসঙ্গে থাকতে পারে না
  • ব্যতিক্রমের আর একটি কারণ দুটি শিমের অস্তিত্ব
  • বা কনটেক্সট বিনের সংজ্ঞা যা সংজ্ঞায়িত হয় না তা বসন্ত প্রসঙ্গে নাম দ্বারা অনুরোধ করা হয়

আরও এই url দেখুন:

http://www.baeldung.com/spring-nosuchbeandefinitionexception


1
 <context:component-scan base-package="com.*" />

একই ইস্যুটি উপস্থিত হয়েছে, আমি টীকাগুলি অক্ষুণ্ন রেখে এবং প্রেরণকারী সার্লেটে :: এটি com.*.আমার পক্ষে কাজ করে বেস প্যাকেজ স্ক্যানটি রেখে সমাধান করেছি।


1

এটি আপনাকে সাহায্য করতে পারে:

আমার প্রকল্পে আমারও একই ব্যতিক্রম রয়েছে। অনুসন্ধানের পরে আমি দেখতে পেলাম যে ক্লাসে আমি @ সার্ভিস টিকাটি মিস করছি যেখানে আমি @ অটোভায়ার্ডে যে ইন্টারফেসটি ব্যবহার করতে চাই তার প্রয়োগ করছি।

আপনার কোডে আপনি @ পরিষেবা টীকাটি মেইলম্যানেজার ক্লাসে যুক্ত করতে পারেন।

@Transactional
@Service
public class MailManager extends AbstractManager implements IMailManager {

@Serviceটীকা রয়েছে @Component। উভয় থাকা অপ্রয়োজনীয়।
অ্যান্থনিডাব্লু

1

@ অটোয়ার মেইলম্যানেজার মেইল ​​ম্যানেজারের পরিবর্তে, আপনি নীচে প্রদত্ত শিমটি উপহাস করতে পারেন:

import org.springframework.boot.test.mock.mockito.MockBean;

::
::

@MockBean MailManager mailManager;

এছাড়াও, আপনি ক্লাসে @MockBean MailManager mailManager;পৃথকভাবে কনফিগার করতে পারেন @SpringBootConfigurationএবং নীচের মত শুরু করতে পারেন:

@Autowire MailManager mailManager

1

আমার বসন্ত বুট অ্যাপ্লিকেশনে একই সমস্যাটির মুখোমুখি হয়েছি যদিও আমার প্যাকেজ নির্দিষ্ট স্ক্যানগুলি এর মতো সক্ষম হয়েছে

@SpringBootApplication(scanBasePackages={"com.*"})

তবে, @ComponentScan({"com.*"})আমার অ্যাপ্লিকেশন ক্লাস সরবরাহ করে বিষয়টি সমাধান করা হয়েছিল ।


0

আমার অনুমান যে এখানে

<context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>

সমস্ত টীকাগুলি প্রথমে ব্যবহার-ডিফল্ট-ফিল্টারগুলি = "ভুয়া" দ্বারা অক্ষম করা হয় এবং তারপরে কেবলমাত্র @Controller টীকা সক্ষম। সুতরাং, আপনার @ কম্পোনেন্ট টীকাটি সক্ষম নয়।


0

আপনি যদি আপনার নিয়ামকটি পরীক্ষা করে থাকেন। আপনার পরীক্ষা ক্লাসে @ ওয়েবে অ্যাপস কনফিগারেশন ব্যবহার করতে ভুলবেন না।


0

আমার এটি ঘটেছে কারণ আমি আমার পরিষেবা শ্রেণিতে একটি স্বয়ংসম্পূর্ণ নির্ভরতা যুক্ত করেছি তবে এটি আমার পরিষেবা ইউনিট পরীক্ষায় ইনজেকশনের উপহাসগুলিতে যুক্ত করতে ভুলে গিয়েছি।

ইউনিট পরীক্ষার ব্যতিক্রম সার্ভিস ক্লাসে সমস্যাটি ইউনিট পরীক্ষায় আসলে রিপোর্ট করার জন্য উপস্থিত হয়েছিল। পূর্ববর্তী ক্ষেত্রে, ত্রুটি বার্তাটি আমাকে জানিয়েছিল যে সমস্যাটি ঠিক কী।


0

যে সমাধানটি আমার পক্ষে কাজ করেছিল তা হ'ল প্রাসঙ্গিক সমস্ত শ্রেণি যুক্ত করা @ContextConfiguration পরীক্ষামূলক শ্রেণীর জন্য টীকাতে ।

শ্রেণীর পরীক্ষার জন্য, MyClass.javaদুটি স্বতঃবাহিত উপাদান ছিল: AutowireAএবং AutowireB। এই আমার স্থির।

@ContextConfiguration(classes = {MyClass.class, AutowireA.class, AutowireB.class})
public class MyClassTest {
...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.