Oolongtea879 2024-05-21 15:56 采纳率: 16.7%
浏览 1

Java传参不成功求解

浏览器能获取数据
methodName=expenseAdd&type=%E9%80%9A%E4%BF%A1%E8%B4%B9%E7%94%A8&amount=100&itemdesc=1&mgrid=&expdesc=222
idea总是报错
DEBUG - ==> Preparing: insert into expense values(default,?,?,now(),?,?,?,?)
DEBUG - ==> Parameters: qinshui(String), 100.0(Double), 22(String), 12(String), 无(String), 待审核(String)
是因为实体类所用的@Data注解所致吗

 //声明方法:报销申请
    public void expenseAdd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求信息
        //创建变量记录总金额
        Double totalamount=0.0;
        //获取报销项的请求信息
        String[] types = req.getParameterValues("type");
        String[] amounts = req.getParameterValues("amount");
        String[] itemdescs = req.getParameterValues("itemdesc");
        //遍历使用对象存储报销项信息,并将报销项信息存储到集合中
        List<ExpenseItem> list=new ArrayList<>();
        for(int i=0; i<types.length;i++){
            //创建对象
            ExpenseItem expenseItem=new ExpenseItem();
            //存储报销项信息
            expenseItem.setType(types[i]);
            expenseItem.setAmount(Double.valueOf(amounts[i]));
            expenseItem.setItemdesc(itemdescs[i]);
            //换算总金额
            totalamount+=Double.valueOf(amounts[i]);
            //将对象存储到集合中
            list.add(expenseItem);
        }

        //获取报销单信息
        String mgrid = req.getParameter("mgrid");
        String expdesc = req.getParameter("expdesc");
        String empid=((Employee)req.getSession().getAttribute("emp")).getEmpid();
        String status = "待审核";
        String lastResult = "无";
        //创建报销单对象存储报销单信息
        Expense expense=new Expense();
        expense.setEmpid(empid);
        expense.setExpdesc(expdesc);
        expense.setTotalamount(totalamount);
        expense.setNextauditor(mgrid);
        expense.setStatus(status);
        expense.setLastResult(lastResult);
        //处理请求
        //创建业务层对象
        ExpenseService expenseService=new ExpenseServiceImpl();
        int i = expenseService.expenseAddService(expense, list);
        //响应结果
        resp.getWriter().write((i>0)+"");

    }


package com.xt.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Expense {
    private  Integer expid;
    private  String empid;
    private  Double totalamount;
    private  Date exptime;
    private  String expdesc;
    private  String nextauditor;
    private  String lastResult;
    private  String status;

    private  Employee emp;

}
  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-05-21 15:56
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    【您想要解决的问题】:您提问的目的是解决Java后端在处理HTTP请求时,参数传递不成功导致数据库插入操作失败的问题。

    【问题出现原因】:根据您提供的错误信息和代码,问题可能出现在以下几个方面:

    1. 参数绑定错误:从错误日志DEBUG - ==> Parameters: qinshui(String), 100.0(Double), 22(String), 12(String), 无(String), 待审核(String)来看,似乎参数绑定有误,可能是由于前端传递的参数名称与后端接收的参数名称不匹配或者类型不匹配。
    2. 实体类注解问题:您提到是否是因为实体类使用了@Data注解所致,这个注解通常不会导致参数传递问题,它是用来简化Java Bean的getter和setter方法的编写。问题更可能是出在参数的接收和处理上。
    3. 前端数据格式问题:前端传递的数据格式可能有问题,比如type参数是数组形式传递的,但后端可能没有正确处理数组形式的参数。

    【问题解决方案】:

    1. 检查前端参数名称:确保前端传递的参数名称与后端接收的参数名称一致。
    2. 检查后端参数接收:确保后端方法的参数名称与前端传递的参数名称一致,并且类型匹配。
    3. 处理数组参数:如果前端传递的是数组形式的参数,后端需要使用getParameterValues方法来接收,而不是getParameter
    4. 检查实体类属性:确保实体类Expense中的属性与数据库表的列名一致,并且类型匹配。

    【提供代码】:以下是修改后的expenseAdd方法,主要修改了参数接收部分,以确保参数正确绑定:

    public void expenseAdd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求信息
        Double totalamount = 0.0;
        List<ExpenseItem> list = new ArrayList<>();
        
        // 假设前端传递的参数名称为type[], amount[], itemdesc[]
        String[] types = req.getParameterValues("type");
        String[] amounts = req.getParameterValues("amount");
        String[] itemdescs = req.getParameterValues("itemdesc");
        
        // 遍历并创建ExpenseItem对象
        for (int i = 0; i < types.length; i++) {
            ExpenseItem expenseItem = new ExpenseItem(types[i], Double.parseDouble(amounts[i]), itemdescs[i]);
            list.add(expenseItem);
            totalamount += Double.parseDouble(amounts[i]);
        }
        
        // 获取其他参数
        String mgrid = req.getParameter("mgrid");
        String expdesc = req.getParameter("expdesc");
        String empid = ((Employee) req.getSession().getAttribute("emp")).getEmpid();
        String status = "待审核";
        String lastResult = "无";
        
        // 创建Expense对象
        Expense expense = new Expense(empid, totalamount, new Date(), expdesc, mgrid, lastResult, status);
        
        // 创建业务层对象并调用服务方法
        ExpenseService expenseService = new ExpenseServiceImpl();
        int result = expenseService.expenseAddService(expense, list);
        
        // 响应结果
        resp.getWriter().write((result > 0) ? "1" : "0");
    }
    

    【代码运行方式】:将上述代码替换到您的expenseAdd方法中,并确保您的开发环境已经配置好,包括数据库连接、业务逻辑等。

    【代码预期运行结果】:

    如果插入成功,响应结果为"1"。
    如果插入失败,响应结果为"0"。
    

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月21日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画