簡體   English   中英

如何解決BeanCreationExceptrion錯誤?

[英]how to solve BeanCreationExceptrion error?

我嘗試使用spring4和jackrabbit開發一些服務器程序。 當我使用JUnit測試Controller類時,發生BeanCreationExceptrion錯誤。 我認為此錯誤與自動裝配變量相關。 幫我。 如何解決這個問題呢?

這是我的Controller類的負責人。

package kr.ac.jbnu.sql.soremore.controller;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.jcr.Node;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.ac.jbnu.sql.soremore.model.RDML;
import kr.ac.jbnu.sql.soremore.model.Traceability;
import kr.ac.jbnu.sql.soremore.service.IRDMLConverter;
import kr.ac.jbnu.sql.soremore.service.IRDMLDBMgmt;
import kr.ac.jbnu.sql.soremore.service.IRDMLRDFMgmt;
import kr.ac.jbnu.sql.soremore.service.RDMLDBException;
import kr.ac.jbnu.sql.soremore.service.RDMLRDFException;
import kr.ac.jbnu.sql.soremore.service.RevisionControlException;
import kr.ac.jbnu.sql.soremore.service.rdf.RDFConverter;

import org.apache.log4j.Logger;
import org.jdom2.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
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.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;

// reference
// http://crunchify.com/simplest-spring-mvc-hello-world-example-tutorial-spring-model-view-controller-tips/
@Controller
public class SoremoreController {

    private static final int buffer_size = 1024;
    static Logger logger = Logger.getLogger(SoremoreController.class.getName());
    private static String fileName = "";

    @Autowired
    private ApplicationContext appContext  = null;

    @Autowired
    private IRDMLConverter rdmlConverter  = null;

    @Autowired
    private IRDMLRDFMgmt rdmlRDFMgmt  = null;

    @Autowired
    private IRDMLDBMgmt rdmlDBMgmt = null;

    @Autowired
    private RDFConverter rdfConverter  = null;
....

這是我的測試課。

package kr.ac.jbnu.sql.soremore.controller;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import kr.ac.jbnu.sql.soremore.model.RDML;
import kr.ac.jbnu.sql.soremore.model.Traceability;
import kr.ac.jbnu.sql.soremore.service.RDMLDBException;

import org.jdom2.Document;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = { "classpath:/soremore-servlet.xml" })
@ContextConfiguration(locations = { "/application-config.xml" })
public class SoremoreControllerTest {

    @Autowired
    SoremoreController soremoreController = null;

    @Test
    public void storeRDML() {
//      String[] hwpmlPaths = { "resource/sample_rdml/예제 1.xml",
//              "resource/sample_rdml/예제 2.xml",
//              "resource/sample_rdml/예제 3.xml",
//              "resource/sample_rdml/예제 4.xml",
//              "resource/sample_rdml/예제 5.xml",
//              "resource/sample_rdml/예제 6.xml",
//              "resource/sample_rdml/예제 7.xml",
//              "resource/sample_rdml/예제 8.xml",
//              "resource/sample_rdml/예제 9.xml",
//              "resource/sample_rdml/예제 10.xml" };
//
//      for (String hwpmlPath : hwpmlPaths) {
//          soremoreController.storeRDML(hwpmlPath);
//      }

        ArrayList<RDML> rdmls = loadTestRDML();
        boolean isSuccessful = false;
        for (RDML rdml : rdmls) {
            try {
                soremoreController.storeRDML(rdml);
                System.out.println();
                isSuccessful = true;
            } catch (Exception e) {
                e.printStackTrace();
                isSuccessful = false;
            }
        }
        Assert.assertTrue(isSuccessful);
    }

    @Test
    public void storeRDMLWithTraceability() throws IOException {
        List<RDML>rdmls = null ;
        String previousRDMLId = "xxx";

        for (RDML rdml : rdmls) {
            soremoreController.storeRDMLWithTraceability(rdml,
                    previousRDMLId, TraceabilityTypes.satisfy);
        }
    }

    @Test
    public void updateRDMLWithTraceability() {
        String previousRDMLId1 = "xxx";
        String previousRDMLId2 = "xxx";

        String updatedTraceability = soremoreController.updateRDMLTraceability(
                previousRDMLId1, previousRDMLId2, TraceabilityTypes.satisfy);
    }

    @Test
    public void deleteRDMLWithTraceability() {
        String previousRDMLId1 = "xxx";
        String previousRDMLId2 = "xxx";

        String removedTraceability = soremoreController.deleteRDMLTraceability(
                previousRDMLId1, previousRDMLId2);
    }

    @Test
    public void searchRDML() {
        String rdmlKeyWord = "abc";

        ArrayList<RDML> rdmls = soremoreController.searchRDML(rdmlKeyWord);
        for (RDML rdml : rdmls) {
            System.out.println(rdml);
        }
    }

    @Test
    public void searchRDML0() {
        String rdmlKeyWord = "def";

        ArrayList<RDML> rdmls = soremoreController.searchRDML(rdmlKeyWord);
        for (RDML rdml : rdmls) {
            System.out.println(rdml);
        }
    }

    @Test
    public void searchRDML1() {
        String rdmlKeyWord = "2차년도계획서";

        ArrayList<RDML> rdmls = soremoreController.searchRDML(rdmlKeyWord);
        for (RDML rdml : rdmls) {
            System.out.println(rdml);
        }
    }

    @Test
    public void getRDML() {
        String rdmlID = "abc";
        RDML rdml = soremoreController.getRDML(rdmlID);
    }

    @Test
    public void getParentIDs() {
        String rdmlID = "abcd";

        ArrayList<String> parentIDs = soremoreController.getParentIDs(rdmlID);

        for (String string : parentIDs) {

        }
    }

    @Test
    public void getChildIDs() {
        String rdmlID = "abcd";

        ArrayList<String> childIDs = soremoreController.getChildIDs(rdmlID);

        for (String string : childIDs) {

        }
    }

    public void getDirectLinkedTraceability() {
        String rdmlID = "abcd";
        ArrayList<Traceability> linkedTraceabilities = soremoreController
                .getDirectLinkedTraceability(rdmlID);

        for (Traceability traceability : linkedTraceabilities) {

        }

    }

    public ArrayList<RDML> loadTestRDML() {
        ArrayList<RDML> rdmls = new ArrayList<RDML>();
        String xmlSource = "resource/sample_rdml";

        File sourceDir = new File(xmlSource);
        File[] sourceFiles = sourceDir.listFiles();
        for (File file : sourceFiles) {
            RDML rdml = new RDML();
            rdml.setRdmlAsDocument(createDocument(file));
            rdmls.add(rdml);
        }

        return rdmls;
    }

    private Document createDocument(File rdmlPathAsFile) {
        SAXBuilder jdomBuilder = new SAXBuilder();
        Document jdomDocument = null;
        try {
            jdomDocument = jdomBuilder.build(rdmlPathAsFile);
        } catch (JDOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return jdomDocument;
    }
}

這是我的spring配置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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="kr.ac.jbnu.sql.soremore" />

    <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" />
        <property name="contentType" value="text/html; charset=UTF-8" />
    </bean>



    <!-- for file upload -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- setting maximum upload size -->
        <property name="maxUploadSize" value="20000000" />

    </bean>
</beans>

這是一個變量的類的頭。

package kr.ac.jbnu.sql.soremore.service.rdml;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.ValueFormatException;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.version.Version;
import javax.jcr.version.VersionException;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
import javax.jcr.version.VersionManager;
import javax.xml.parsers.ParserConfigurationException;

import kr.ac.jbnu.sql.soremore.controller.SoremoreController;
import kr.ac.jbnu.sql.soremore.model.RDML;
import kr.ac.jbnu.sql.soremore.service.IRDMLDBMgmt;
import kr.ac.jbnu.sql.soremore.service.RDMLDBException;
import kr.ac.jbnu.sql.soremore.service.RevisionControlException;

import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.log4j.Logger;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.XMLOutputter;
import org.springframework.stereotype.Service;

@Service
public class RDMLDBMgmtImpl implements IRDMLDBMgmt {
    static Logger logger = Logger.getLogger(SoremoreController.class.getName());
    static private int docNumber = 0;
    private Repository repository;
    private Session session;
....

這是堆棧跟蹤。

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kr.ac.jbnu.sql.soremore.controller.SoremoreControllerTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: kr.ac.jbnu.sql.soremore.controller.SoremoreController kr.ac.jbnu.sql.soremore.controller.SoremoreControllerTest.soremoreController; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [kr.ac.jbnu.sql.soremore.controller.SoremoreController] 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)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:385) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:82) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:199) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:251) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:253) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:216) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:82) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:60) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:67) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:162) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: kr.ac.jbnu.sql.soremore.controller.SoremoreController kr.ac.jbnu.sql.soremore.controller.SoremoreControllerTest.soremoreController; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [kr.ac.jbnu.sql.soremore.controller.SoremoreController] 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)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 26 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [kr.ac.jbnu.sql.soremore.controller.SoremoreController] 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)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1261) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1009) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527) ... 28 more 

為了讓Spring在您的測試案例中自動裝配SoremoreController字段,它需要在ApplicationContext中為該類型的bean定義一個bean。 這意味着您需要對在ContextConfiguration批注中指出的xml文件中定義了SoremoreController的包(或父包)進行組件掃描。

請注意,SoremoreController實例中的所有自動裝配字段也必須在ApplicationContext中定義相應的bean,否則Spring將無法創建該實例,從而導致測試失敗,並且堆棧跟蹤類似於您發布的跟蹤(但始終明確指出-朝向最后-問題的根本原因)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM