moonhow007 2015-09-11 10:11 采纳率: 0%
浏览 1528

关于Struts2 类型转换的奇葩问题?

前端代码:
图片说明
后台代码:
action:
private SomeObj obj; getObj(...){...} setObj(...){...}
model:
private Long date1;
private Long date2;
public Long getDate1(){
return this.date1;
}
//date2 getter方法同date1

public void setDate1(Long date1){
this.date1 = date1;
}
public void setDate1(String date1){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if(date1 != null){
try{
this.date1 = sdf.parse(date1).getTime() / 1000;
}catch(ParseException e){
//...
}
}
}
//date2的setter方法同date1.
问题:date1通过setter方法注入了值,date2却没有进入setter方法!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-04 08:20
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于Java中日期时间类型(Date和Time)在序列化和反序列化时存在一些兼容性问题。在你的例子中,你尝试将一个日期字符串("2015-9-11")直接赋给Long类型的变量date1,这会导致编译错误。

    正确的做法是在获取到日期后进行相应的处理,比如将其转换为毫秒表示形式(例如new Date(1447830400000L)),然后再将其设置回date1。这样可以避免出现类似的问题。

    以下是修改后的代码示例:

    import java.util.Date;
    import org.apache.struts2.convention.annotation.*;
    
    
    @Action("/set_date")
    @Results({
        @Result(name="success", type="json"),
        @Result(name="error", type="json")
    })
    public class SetDateAction extends ActionSupport {
    
        private static final long serialVersionUID = -6434463484493699217L;
    
        @FormParam("date1")
        private String date1;
    
        @FormParam("date2")
        private String date2;
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Date date1 = null;
            Date date2 = null;
    
            try {
                date1 = parseDate(request.getParameter("date1"));
                date2 = parseDate(request.getParameter("date2"));
    
                request.setAttribute("date1", date1);
                request.setAttribute("date2", date2);
    
                // 设置成功响应
                request.setAttribute("success", true);
            } catch (ParseException e) {
                // 设置错误响应
                request.setAttribute("success", false);
                request.setAttribute("error", "Invalid date format");
            }
        }
    
        private Date parseDate(String dateString) throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            return sdf.parse(dateString);
        }
    }
    

    在这个例子中,我们首先尝试从请求参数中解析日期。如果解析失败,我们将抛出一个ParseException并返回一个错误响应。否则,我们使用request.getAttribute()来获取两个日期对象,并将它们传递给视图。这样,你可以看到date1date2都是有效的日期对象。

    评论

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格