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());
}
}
那是什么原因导致这个问题呢?