Spring3-Mybatis Autowired NullPonterException

时间:2014-06-18 01:44:00

标签: spring nullpointerexception mybatis autowired

Spring3 + Mybatis配置如下,但在Controller上发生NullPointerException。 我无法找到原因,请帮助..

错误的fullstacktrace

java.lang.NullPointerException
at hello.HelloController.insert(HelloController.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:186)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)

控制器类

@Controller
public class HelloController {

static Logger log = Logger.getLogger(HelloController.class);

@Autowired
private UserService userService;

@RequestMapping(value = { "/", "/index.do" })
public ModelAndView home2() {
    return new ModelAndView("hello");
}

@RequestMapping("userform")
public ModelAndView form() {
    return new ModelAndView("userform", "command", new User());
}

@RequestMapping(value = "createuser", method = RequestMethod.POST)
public ModelAndView insert(@ModelAttribute("user") User user, BindingResult result) {

    log.info("insert:"+userService+","+user);

    userService.createUser(user); <---- NullPointerException
    return new ModelAndView("create_ok");
}

}

UserService类

@Service
@Configurable
public class UserService {

@Autowired
private Mapper mapper;

public User getUser(String userId) {
    return mapper.getUser(userId);
}

public void createUser(User user) {
    mapper.createUser(user);
}
}

Mapper类

public interface Mapper {
public User getUser(String userId);
public void createUser(User user);
}

的web.xml(部分)

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    /WEB-INF/spring-security.xml
    /WEB-INF/mybatis-config.xml
    /WEB-INF/jdbc-context.xml
    </param-value>
</context-param>

的MyBatis-config.xml中

<configuration>

<settings>
    <!-- changes from the defaults -->
   <setting name="lazyLoadingEnabled" value="false" />
</settings>
<typeAliases>
    <typeAlias type="hello.User" alias="user"/>
</typeAliases>
</configuration>

JDBC-context.xml中

<context:annotation-config />
<context:component-scan base-package="hello"/>

<!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- Declare a datasource that has pooling capabilities -->
<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://XXX.XXX.XXX.XXX:3306/mybatis" />
    <property name="username" value="XXXXXX" />
    <property name="password" value="XXXXXX" />
</bean>

<!-- Declare a transaction manager -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource" />

<!-- define the SqlSessionFactory, notice that configLocation is not needed 
    when you use MapperFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- bean id="userService" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="hello.Mapper" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean-->

<!-- scan for mappers and let them be autowired --> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="hello" />
</bean>

0 个答案:

没有答案