使用struts,spring,mybatis创建Web项目,spring无法注入对象

时间:2018-10-29 12:55:25

标签: java spring struts2

UserAction.java

public class UserAction extends ActionSupport {
    private User user = new User();

    @Autowired
    private UserService userService;

    public String loginForm() {
         return SUCCESS;
    }

    public String login() {
        User user2 = userService.getUser(user.getUsername());
        if(user2!=null && user2.getPassword().equals(user.getPassword())) {
            if(userService.isAdmin(user2)) {
                return "admin";
            } else {
                return "common";
            }
        }
        return "input";
    }

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

UserService.java

package com.shallowinggg.service;
import com.shallowinggg.entity.User;

public interface UserService {

    User getUser(String username);

    boolean isAdmin(User user);

    boolean isCommon(User user);

    boolean isExist(String username);
}

UserServiceImpl.java

package com.shallowinggg.service;

import com.shallowinggg.dao.UserMapper;
import com.shallowinggg.entity.User;
import org.springframework.beans.factory.annotation.Autowired;

public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Override
    public boolean isExist(String username) {
        return userMapper.getUser(username) != null;
    }

    @Override
    public boolean isAdmin(User user) {
        return user.getAuthority()==0;
    }

    @Override
    public boolean isCommon(User user) {
        return user.getAuthority()!=0;
    }

    @Override
    public User getUser(String username) {
        return userMapper.getUser(username);
    }

    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<struts>
<constant name="struts.devMode" value="true" />

<package name="user" extends="struts-default">
    <action name="loginForm" class="com.shallowinggg.action.UserAction" method="loginForm">
        <result name="success">/WEB-INF/jsp/login.jsp</result>
    </action>

    <action name="login" class="com.shallowinggg.action.UserAction" method="login">
        <result name="input">/WEB-INF/jsp/login.jsp</result>
        <result name="admin" type="redirectAction">info</result>
    </action>

    <action name="info" class="com.shallowinggg.action.StudentAction" method="info">
            <result name="success">/WEB-INF/jsp/info.jsp</result>
    </action>
</package>
</struts>

applicationContext.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

<bean id="propertyConfigure"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:db.properties</value>
        </list>
    </property>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.shallowinggg.dao"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.shallowinggg.dao.UserMapper"/>
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

<bean id="studentMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.shallowinggg.dao.StudentMapper"/>
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

<bean id="userService" class="com.shallowinggg.service.UserServiceImpl">
    <property name="userMapper" ref="userMapper"/>
</bean>

<bean id="userAction" class="com.shallowinggg.action.UserAction" scope="prototype">
    <property name="userService" ref="userService"/>
</bean>

<bean id="studentService" class="com.shallowinggg.service.StudentServiceImpl">
    <property name="studentMapper" ref="studentMapper"/>
</bean>

<bean id="studentAction" class="com.shallowinggg.action.StudentAction" scope="prototype">
    <property name="studentService" ref="studentService"/>
</bean>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
     version="4.0">
  <display-name>Archetype Created Web Application</display-name>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

<filter>
    <filter-name>Struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>setCharacter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>setCharacter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

当我在tomcat中运行它时,以表格形式输入消息并提交,我得到了NullPointerException。

错误消息:

2018-10-29 20:38:14,990 DEBUG [http-nio-8080-exec-7] validator.ValidationInterceptor (ValidationInterceptor.java:219) - Validating //login with method login.
2018-10-29 20:38:15,003 DEBUG [http-nio-8080-exec-7] validator.ValidationInterceptor (ValidationInterceptor.java:236) - Invoking validate() on action com.shallowinggg.action.UserAction@700c7d3e
2018-10-29 20:38:15,003 DEBUG [http-nio-8080-exec-7] interceptor.PrefixMethodInvocationUtil (PrefixMethodInvocationUtil.java:160) - Cannot find method [validateLogin] in action [com.shallowinggg.action.UserAction@700c7d3e]
2018-10-29 20:38:15,003 DEBUG [http-nio-8080-exec-7] interceptor.PrefixMethodInvocationUtil (PrefixMethodInvocationUtil.java:160) - Cannot find method [validateDoLogin] in action [com.shallowinggg.action.UserAction@700c7d3e]
2018-10-29 20:38:15,003 DEBUG [http-nio-8080-exec-7] xwork2.DefaultActionInvocation (DefaultActionInvocation.java:430) - Executing action method = login
2018-10-29 20:38:15,004 DEBUG [http-nio-8080-exec-7] ognl.SecurityMemberAccess (SecurityMemberAccess.java:60) - Checking access for [target: com.shallowinggg.action.UserAction@700c7d3e, member: public java.lang.String com.shallowinggg.action.UserAction.login(), property: null]
2018-10-29 20:38:15,004 DEBUG [http-nio-8080-exec-7] accessor.XWorkMethodAccessor (XWorkMethodAccessor.java:104) - Error calling method through OGNL: object: [java.lang.NullPointerException] method: [com.shallowinggg.action.UserAction@700c7d3e] args: [login]
2018-10-29 20:38:15,004 DEBUG [http-nio-8080-exec-7] ognl.SecurityMemberAccess (SecurityMemberAccess.java:60) - Checking access for [target: com.shallowinggg.action.UserAction@700c7d3e, member: public java.util.Locale com.opensymphony.xwork2.ActionSupport.getLocale(), property: locale]
2018-10-29 20:38:15,004 DEBUG [http-nio-8080-exec-7] ognl.SecurityMemberAccess (SecurityMemberAccess.java:60) - Checking access for [target: com.shallowinggg.action.UserAction@700c7d3e, member: public java.util.Locale com.opensymphony.xwork2.ActionSupport.getLocale(), property: locale]
2018-10-29 20:38:15,004 DEBUG [http-nio-8080-exec-7] interceptor.I18nInterceptor (I18nInterceptor.java:124) - After action invocation Locale=zh_CN
java.lang.NullPointerException
    at com.shallowinggg.action.UserAction.login(UserAction.java:25)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:899)
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1544)
    at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)
    at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:98)
    at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:90)
    at ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1620)
    at ognl.ASTMethod.getValueBody(ASTMethod.java:91)
    at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    at ognl.SimpleNode.getValue(SimpleNode.java:258)
    at ognl.Ognl.getValue(Ognl.java:470)
    at ognl.Ognl.getValue(Ognl.java:434)
    at com.opensymphony.xwork2.ognl.OgnlUtil$3.execute(OgnlUtil.java:374)
    at com.opensymphony.xwork2.ognl.OgnlUtil.compileAndExecuteMethod(OgnlUtil.java:426)
    at com.opensymphony.xwork2.ognl.OgnlUtil.callMethod(OgnlUtil.java:372)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:438)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:293)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:250)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:179)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:49)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.doIntercept(ConversionErrorInterceptor.java:142)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:137)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:137)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:201)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:67)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:133)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:89)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:101)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:142)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:160)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:175)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:99)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:121)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:167)
2018-10-29 20:38:15,012 DEBUG [http-nio-8080-exec-7] dispatcher.DefaultDispatcherErrorHandler (DefaultDispatcherErrorHandler.java:104) - Exception occurred during processing request: null
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
java.lang.NullPointerException: null

但是当我测试使用@JUnit时,我可以获取userService并成功执行此过程。

测试:

public class UserDaoTest {
    private ApplicationContext applicationContext;

    @Before
    public void init() {
        applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
    @Test
    public void test3() {
        UserAction action = (UserAction) applicationContext.getBean("userAction");
        User user = new User();
        user.setUsername("root");
        user.setPassword("123456");
        action.setUser(user);
        System.out.println(action.login());
    }
}

那是什么原因导致这个问题呢?

0 个答案:

没有答案