Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]

问题场景: 在使用表单向Action传递数据的时候, 遇到了这个问题, 导致了空指针异常. 

问题描述:

10:14:56.622 [http-nio-8080-exec-45] ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'password' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'password' with value ['123456', ]
10:14:56.648 [http-nio-8080-exec-45] ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'submit' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'submit' with value ['', ]
10:14:56.649 [http-nio-8080-exec-45] ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor - Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]
java.lang.NullPointerException
    at com.bj186.crm.web.action.UserAction.login(UserAction.java:70)
    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:498)
    at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:902)
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1547)
    at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)

问题分析: 这个问题非常隐蔽, 是Struts2在接受值的时候, 不能正确的接收. 问题的根本原因在于没有创建接收数据的对象

解决思路: 在Action中把需要接收数据的类的对象new出来

private User user = new User();

并且设置它的getter和setter方法

然后这个问题就解决了!!!

附Struts2的UserAction.java的代码

package com.bj186.crm.web.action;

import com.bj186.crm.entity.User;
import com.bj186.crm.service.UserService;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.struts2.ServletActionContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletContext;
import java.util.Arrays;
import java.util.List;

public class UserAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User();
    private UserService userService;
    private ValueStack valueStack;

    //测试添加上User的get和set方法
    public void setUser(User user) {
        //ServletActionContext.getRequest().getParameter("username")
        this.user = user;
    }

    public User getUser() {
        return user;
    }

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

    public UserAction() {
        //1.获取ServletContext
        ServletContext servletContext = ServletActionContext.getServletContext();
        //2.通过整合包中的工具类, 从servletContext的作用域上获取目标--Spring的容器WebApplicationContext
        WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        //3.从Spring的容器中获取对象
        userService = webApplicationContext.getBean("userService", UserService.class);
        System.out.println("userService:"+userService);
        //4.获取值栈
        ActionContext context = ActionContext.getContext();
        valueStack = context.getValueStack();
    }

    public String execute() {
        System.out.println("正在UserAction的execute()方法中!");
        return Action.SUCCESS;
    }

    /**
     * 添加用户
     * @return 字符串状态
     */
    public String register() {
        User user = (User) valueStack.findValue("user");
        userService.register(user);
        return Action.SUCCESS;
    }

    /**
     * 用户登录
     * @return
     */
    public String login() {
        String username = user.getUsername();
        String password = user.getPassword();
        boolean isLogin = userService.verifyLogin(username,password);
        return isLogin? Action.SUCCESS: Action.NONE;
    }

    /**
     * 删除用户
     * @return 字符串状态
     */
    public String deleteUser(Integer uid) {
        userService.deleteUser(uid);
        return Action.SUCCESS;
    }

    /**
     * 修改用户
     * @return 字符串状态
     */
    public String updateUser() {
        User user = (User)valueStack.findValue("user");
        userService.updateUser(user);
        return Action.SUCCESS;
    }

    /**
     * 查询用户
     * @return 字符串状态
     */
    public String getUserById(Integer uid) {
        User user = userService.selectUserById(uid);
        System.out.println("查询出来的用户是: " + user);
        return Action.SUCCESS;
    }

    /**
     * 显示用户页面
     * @return
     */
    public String showAllUsers() {
        System.out.println("显示所有的用户");
        return Action.SUCCESS;
    }

    /**
     * 查询出所有的用户
     * @return
     */
    public String selectAllUsers() {
        List<User> userList = userService.selectAllUsers();
        valueStack.set("userList",userList);
        System.out.println("查到的用户个数为: " + userList.size());
        return Action.SUCCESS;
    }

    @Override
    public User getModel() {
        return user;
    }
}
View Code

前端页面的index.jsp代码

<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>用户管理系统首页</title>
  </head>
  <body>
      <h2 style="color:red;">欢迎光临!</h2>
  <form action="<%=request.getContextPath()%>/user_login.action" method="post">
      <input name="username" type="text"><br/>
      <input name="password" type="password"><br/>
      <button name="submit" type="submit">登录</button>
  </form>
  </body>
</html>
View Code
原文地址:https://www.cnblogs.com/zjulanjian/p/10953837.html