복붙노트

[SPRING] Spring 4.1.5.RELEASE는 Hibernate 4.3.8의 SessionFactory에 대한 의존성 주입을하지 못한다. 최종

SPRING

Spring 4.1.5.RELEASE는 Hibernate 4.3.8의 SessionFactory에 대한 의존성 주입을하지 못한다. 최종

Hibernate가 관련된만큼 질문은 중복되지 않는다.

제임스의 대답이 문제를 부분적으로 해결 했으므로이를 받아 들여 새로운 질문을 열었습니다. 여기서 계속하십시오.

SessionFactory를 저장소 클래스에 삽입하려고합니다. 그러나 코드가 NullPointer 예외를 반환하므로 작동하지 않는 것처럼 보입니다. 나는 프로젝트를 청소하고 재건했지만 문제는 여전히 존재합니다. 또한 @Autowired를 setSessionFactory 메서드에 넣었지만 도움이되지 않았습니다.

인터페이스

public interface TestRep {
public void get(int id);
}

수업

@Repository
public class TestRepImpl implements TestRep{

    @Autowired
    SessionFactory sessionFactory;


    public TestRepImpl() {

    }

    public TestRepImpl(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Transactional
    public void get(int id) {
        String hql = "from Business where id=" + id;
        Query query = sessionFactory.getCurrentSession().createQuery(hql);
         ....

pr-servlet.xml

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

<context:annotation-config/>
 .....
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>

<tx:annotation-driven />
<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="TestRep" class="com.project.repository.TestRepImpl">
    <constructor-arg>
        <ref bean="sessionFactory" />
    </constructor-arg>
</bean>

StackTrace

    Mar 10, 2015 12:22:21 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [pr] in context with path [/project] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at com.project.repository.TestRepImpl.get(TestRepImpl.java:39)
    at com.project.web.MainController.index(MainController.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

항아리

MainController

@Controller
public class MainController {

     @RequestMapping("/{viewName}.htm")
     public String index(@PathVariable(value = "viewName") String viewName) {
     System.err.println(viewName);
     Test test = new Test();
     test.get(1);
     if (isValidView(viewName)) {
     return viewName;
     }
     return null;
     }

    @RequestMapping("/{viewName}/{viewName2}") //suburb/catname
    public String index(@PathVariable(value = "viewName") String viewName, Model model) {
        System.err.println(viewName);
        if (isValidView(viewName)) {
            model.addAttribute("viewName",viewName);
            return "page";
        }
        return null;
    }

    private boolean isValidView(String viewName) {
        switch (viewName) {
        case "index":
        case "aboutus":
            return true;
        }
        return false;
    }

}

테스트

@Service 
public class Test {

    public void get(int i){
         TestRepImpl test = new TestRepImpl();
         test.get(i);
    }
}

Hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">12</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>


        <mapping class="com.myproject.model.MyTable" />
        ....

해결법

  1. ==============================

    1.어디에서나 자동 와이어 링을 사용해야합니다. 그렇지 않으면 프로그램이 작동하지 않습니다. Spring은 @Controller, @Service 및 @Repository 주석이해야하는 Spring 응용 프로그램 컨텍스트에있는 bean 만 autowire 할 수 있습니다. 그러나 이러한 주석은 설정 XML에 태그가 없으면 의미가 없습니다.

    어디에서나 자동 와이어 링을 사용해야합니다. 그렇지 않으면 프로그램이 작동하지 않습니다. Spring은 @Controller, @Service 및 @Repository 주석이해야하는 Spring 응용 프로그램 컨텍스트에있는 bean 만 autowire 할 수 있습니다. 그러나 이러한 주석은 설정 XML에 태그가 없으면 의미가 없습니다.

    따라서 컨트롤러, 서비스 및 DAO가 패키지 com.repository의 어딘가에 있다고 가정하면 XML 구성에이 행을 추가해야합니다.

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

    이것은 @Controller, @Service, @Repository 및 @Component로 주석 된 클래스에 대해 foo.bar.baz 패키지 (및 모든 하위 패키지)를 재귀 적으로 검색하고, 이들의 싱글 톤 인스턴스를 인스턴스화하고 해당 컴포넌트를 적격성있게 만들기 위해 Spring에 알려줍니다 다른 클래스에 자동으로 추가 될 수 있습니다.

    @Autowired를 사용하려면 컨트롤러 및 서비스 클래스를 수정해야합니다. Spring은 new 키워드로 인스턴스를 생성하면 클래스를 관리 할 수 ​​없다. 이 콩은 이유가 있기 때문에 싱글 톤입니다 (단 하나의 인스턴스 만 프로그램에 존재해야합니다).

    컨트롤러를 다음과 같이 변경해야합니다.

    @Controller
    public class MainController {
    
        @Autowired
        private TestService testService;
    
        @RequestMapping("/{viewName}.htm")
        public String index(@PathVariable(value = "viewName") String viewName) {
             System.err.println(viewName);
             testService.get(1);
             if (isValidView(viewName)) {
                 return viewName;
             }
             return null;
         }
    
        @RequestMapping("/{viewName}/{viewName2}") //suburb/catname
        public String index(@PathVariable(value = "viewName") String viewName, Model model) {
            System.err.println(viewName);
            if (isValidView(viewName)) {
                model.addAttribute("viewName",viewName);
                return "page";
            }
            return null;
        }
    
        private boolean isValidView(String viewName) {
            switch (viewName) {
            case "index":
            case "aboutus":
                return true;
            }
            return false;
        }
    }
    

    서비스 클래스를 컨트롤러에 Autowire합니다.

    서비스 클래스는 인터페이스를 구현해야합니다. Spring은이 autowiring 마법을 인터페이스를 사용하여 수행한다. XML 구성에서 해당 클래스의 인스턴스를 특별히 만들지 않는 한 인터페이스를 구현하지 않는 클래스를 autowire 할 수 없습니다.

    서비스 클래스는 다음과 같이 변경해야합니다.

    @Service 
    public class TestServiceImpl implements TestService {
        @Autowired
        private TestRepDao testDao;
    
        @Transactional
        public void get(int i){
             testDao.get(i);
        }
    }
    

    TestService라는 인터페이스를 생성한다.

    public interface TestService{
        public void get(int i);
    }
    

    DAO가된다.

    @Repository
    public class TestRepDaoImpl implements TestRepDao{
    
        @Autowired
        private SessionFactory sessionFactory;
    
        public void get(int id) {
            String hql = "from Business where id=" + id;
            Query query = sessionFactory.getCurrentSession().createQuery(hql);
        }
    }
    

    TestRepDao 인터페이스를 구현하는 :

    public interface TestRepDao{
        public void get(int id);
    }
    

    당신은 또한 선언을 제거 할 수 있습니다

    <bean id="TestRep" class="com.project.repository.TestRepImpl">
        <constructor-arg>
            <ref bean="sessionFactory" />
        </constructor-arg>
    </bean>
    

    귀하의 XML 구성에서.

    봄 컨벤션에 더 잘 부합하도록 몇 개의 클래스 이름을 변경했습니다. 귀하의 응용 프로그램은 컨트롤러에서 서비스 클래스로 DAO로 계층화되어 다시 나가야합니다. 이렇게하면 내가 여기에 제시 한 단계를 수행하면됩니다.

    명심할 몇 가지 사항 :

  2. from https://stackoverflow.com/questions/28955754/spring-4-1-5-release-fails-to-do-dependency-injection-for-sessionfactory-of-hibe by cc-by-sa and MIT license