日期:2014-05-17  浏览次数:20707 次

问个SpringMVC的问题
我自己写了一个字符串到日期类型的转换器,把从表单提交的字符串日期转化成java的date类型,当转化失败的时候抛出异常。
但是当我测试的时候发现,转化失败的时候并没有抛出任何异常,SpringMVC直接给我返回一个400错误页面。
现在我想当我数据转化失败的时候得到这个错误,然后进行处理,再返回给用户一个友好的提示,这时候应该怎么做呢?
代码如下:

这是控制器的代码



这是VO对象代码



这是转化器的代码



这是返回的400错误页面



这是控制台的信息,可以看到这个时候并没有抛出任何异常

------解决方案--------------------
引用:
Quote: 引用:

请求里面有个User参数,但是你传的2个参数不能转化为user的时候就是无User参数直接请求无效了,有没有考虑把Date类型与User分开处理,将Date转化完了之后再给User
我们用框架的目的就是让框架帮我们做事,如果按你这样解决的话,不只是字符串到日期,字符串到数字也存在会转化失败的问题,也得分开处理。那许多类型的转化也的分开了。我尝试过用字符串接受参数,然后自己再转化,问题是那我要框架干嘛。。。我要框架就是让它帮我做这些工作。这点struts2做的比较好。

那我没啥办法,我之前用这框架做文件上传时候也是,参数同时带文件和对象,结果不能实例化为对象也是400错误,当时没办法只能分开处理了
------解决方案--------------------
楼上一帮不懂瞎指挥。按照我的思路来:
出400错误应该是配置生效了,但是格式错误抛了个异常,这个异常没有被捕获,还没有进入控制层方法体中,根本不管返回值什么事,再说你这样返回void也是没问题的。
这是正确的配置代码:

<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 控制层参数支持Date类型 -->
<bean class="***.***.***.DateConverter" />
</set>
</property>
</bean>


然后你把传入正确的日期格式:yyyy-MM-dd ,  应该就没有问题了;
但是建议你converter这样写:

public class DateConverter implements Converter<String, Date> {
    
    /** date format 格式*/
    private static final String[] PATTERNS = {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd", "HH:mm:ss"};
    
    @Override
    public Date convert(String source) {
        if(!StringUtil.isNvl(source)) {
            try {
                return DateUtils.parseDateStrictly(source, PATTERNS);
            } catch (ParseException e) {
                //异常时参数绑定失败
            }
        }
        return null;
    }
}

日期格式支持多种,需要引入common-lang3jar包。 不要抛异常出去,当发现格式不对时,返回null就好了,由使用者自己去调整自己传入的data格式。
如果抛异常也行,定义个exceptionHandler 处理。 实现spring的HandlerExceptionResolver 并定义bean由spring初始化即可。
然后你就可以在resolveException方法中看到你抛出的RuntimeException