论坛首页 Java企业应用论坛

Spring3 Web MVC下的数据格式化(第二篇)——《跟我学Spring3 Web MVC》抢先看

浏览 16101 次
精华帖 (9) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2012-05-06  
最近项目也用到了spring的conversionService来做类型的自动转化,对这部分源码也有一些研究,但没有LZ这么系统和深入,看了之后受益很多啊,感谢分享!
0 请登录后投票
   发表时间:2012-05-06  
bigtian 写道
最近项目也用到了spring的conversionService来做类型的自动转化,对这部分源码也有一些研究,但没有LZ这么系统和深入,看了之后受益很多啊,感谢分享!

研究不深,只是照着reference写的 
0 请登录后投票
   发表时间:2012-05-07  
jinnianshilongnian 写道
bigtian 写道
最近项目也用到了spring的conversionService来做类型的自动转化,对这部分源码也有一些研究,但没有LZ这么系统和深入,看了之后受益很多啊,感谢分享!

研究不深,只是照着reference写的 

虽然是照着reference写的,还是很受用,因为还没有去看spring 3.1的reference,还不知道有这些变化!
0 请登录后投票
   发表时间:2012-05-09  
嗯。 请教一个问题。

比如
@Controller
@RequestMapping(value = "/just")
public class TestController {

	@ResponseBody
	@RequestMapping(value = "/test", method = {RequestMethod.GET})
	public String test(@RequestParam(value = "phone", required = false) @CellPhoneNumberFormat CellPhoneNumber cellPhoneNumber) {
		return cellPhoneNumber.toString();
	}
}


如果按照我预期的,访问"http://localhost:8080/longnian/just/test?phone=138-1000-0000" 这没有什么问题, 如果故意输入错手机号码格式,SpringMVC直接给一个400(BAD_REQUEST)的应答。

这种默认行为有办法通过配置改变吗?

我实现的Formatter里面,如果手机号码格式不满足正则"\\d{3}-\\d{4}-\\d{4}"则抛出ParseException,
即使我在错误解析器里配置了针对这种异常的逻辑视图名也是无效的。

甚至,我把我的Controller本身也去实org.springframework.web.servlet.HandlerExceptionResolver
也是不能接到这个异常的。

请问龙年兄弟有没有比较优雅的解决方式。
0 请登录后投票
   发表时间:2012-05-09  
yingzhor 写道
嗯。 请教一个问题。

比如
@Controller
@RequestMapping(value = "/just")
public class TestController {

	@ResponseBody
	@RequestMapping(value = "/test", method = {RequestMethod.GET})
	public String test(@RequestParam(value = "phone", required = false) @CellPhoneNumberFormat CellPhoneNumber cellPhoneNumber) {
		return cellPhoneNumber.toString();
	}
}


如果按照我预期的,访问"http://localhost:8080/longnian/just/test?phone=138-1000-0000" 这没有什么问题, 如果故意输入错手机号码格式,SpringMVC直接给一个400(BAD_REQUEST)的应答。

这种默认行为有办法通过配置改变吗?

我实现的Formatter里面,如果手机号码格式不满足正则"\\d{3}-\\d{4}-\\d{4}"则抛出ParseException,
即使我在错误解析器里配置了针对这种异常的逻辑视图名也是无效的。

甚至,我把我的Controller本身也去实org.springframework.web.servlet.HandlerExceptionResolver
也是不能接到这个异常的。

请问龙年兄弟有没有比较优雅的解决方式。

下午回去看看,,这是URL错误问题,属于用户恶意修改

如 你要求URL  /product-分页  如果用户非要输入 /product-AAAA 这是用户恶意修改 

你应该在web.xml 或异常处理器给用户展示错误页面

0 请登录后投票
   发表时间:2012-05-09   最后修改:2012-05-09
jinnianshilongnian 写道

下午回去看看,,这是URL错误问题,属于用户恶意修改

如 你要求URL  /product-分页  如果用户非要输入 /product-AAAA 这是用户恶意修改 

你应该在web.xml 或异常处理器给用户展示错误页面


异常处理器貌似只能处理有Controller组件抛出的异常,在数据绑定阶段。发生的异常由SpringMVC
自己决定如何动作。

看来用web.xml配置一个400页面来得比较方便。
0 请登录后投票
   发表时间:2012-05-09   最后修改:2012-05-09
yingzhor 写道
嗯。 请教一个问题。

比如
@Controller
@RequestMapping(value = "/just")
public class TestController {

	@ResponseBody
	@RequestMapping(value = "/test", method = {RequestMethod.GET})
	public String test(@RequestParam(value = "phone", required = false) @CellPhoneNumberFormat CellPhoneNumber cellPhoneNumber) {
		return cellPhoneNumber.toString();
	}
}


如果按照我预期的,访问"http://localhost:8080/longnian/just/test?phone=138-1000-0000" 这没有什么问题, 如果故意输入错手机号码格式,SpringMVC直接给一个400(BAD_REQUEST)的应答。

这种默认行为有办法通过配置改变吗?

我实现的Formatter里面,如果手机号码格式不满足正则"\\d{3}-\\d{4}-\\d{4}"则抛出ParseException,
即使我在错误解析器里配置了针对这种异常的逻辑视图名也是无效的。

甚至,我把我的Controller本身也去实org.springframework.web.servlet.HandlerExceptionResolver
也是不能接到这个异常的。

请问龙年兄弟有没有比较优雅的解决方式。



如果是400的话,这是没有映射到,,估计@RequestParam(value = "phone", required = false)  引起的required改成true试试

如果绑定失败会报500错误,错误代码类似于:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'model' on field 'phoneNumber': rejected value [01012345671]; codes [typeMismatch.model.phoneNumber,typeMismatch.phoneNumber,typeMismatch.cn.javass.chapter7.model.PhoneNumberModel,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [model.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'cn.javass.chapter7.model.PhoneNumberModel' for property 'phoneNumber'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @cn.javass.chapter7.web.controller.support.formatter.PhoneNumber cn.javass.chapter7.model.PhoneNumberModel for value '01012345671'; nested exception is java.lang.IllegalArgumentException: 类型转换失败,需要格式[010-12345678],但格式是[01012345671]]

typeMismatch.model.phoneNumber 在错误消息中定义即可获取到

0 请登录后投票
   发表时间:2012-08-26   最后修改:2012-08-26
向您请教一下,为什么我下面这段配置不起效果呢?前台页面也是400错误。
配置如下:
<mvc:annotation-driven conversion-service="conversionService">
    	<mvc:argument-resolvers>
    		<bean class="com.xxx.ark.core.web.FormBeanArgumentResolver" /> 
    	</mvc:argument-resolvers>
    </mvc:annotation-driven>
	<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
	        	<bean class="com.xxx.ark.core.web.DateConverter" />  
	    	</set>
		</property>  
	</bean>


使用controller:
@RequestMapping("/save.do")
public void doSave(Date addtime, T entity){}

class Entity {
    private Date addtime;
}


controller doSave方法的addtime注入失败,entity的addtime也注入失败,错误如下:
 org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date';
 nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value '2012-08-26';
0 请登录后投票
   发表时间:2012-08-26  
depravedangel 写道
向您请教一下,为什么我下面这段配置不起效果呢?前台页面也是400错误。
配置如下:
<mvc:annotation-driven conversion-service="conversionService">
    	<mvc:argument-resolvers>
    		<bean class="com.xxx.ark.core.web.FormBeanArgumentResolver" /> 
    	</mvc:argument-resolvers>
    </mvc:annotation-driven>
	<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
	        	<bean class="com.xxx.ark.core.web.DateConverter" />  
	    	</set>
		</property>  
	</bean>


使用controller:
@RequestMapping("/save.do")
public void doSave(Date addtime, T entity){}

class Entity {
    private Date addtime;
}


controller doSave方法的addtime注入失败,entity的addtime也注入失败,错误如下:
 org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date';
 nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type java.util.Date for value '2012-08-26';


你看下你的格式化字符串 能否转换 2012-08-26
0 请登录后投票
   发表时间:2012-08-26   最后修改:2012-08-26
可以的,我调试打断点都没进来,打印输出语句也没输出,代码如下:
public class DateConverter implements  Converter<String, Date> {

	public Date convert(String source) {  
            System.out.println(source);
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
            dateFormat.setLenient(false);  
            try {  
                return dateFormat.parse(source);  
            } catch (ParseException e) {  
                e.printStackTrace();  
        }         
        return null;  
    }  
}

还有别的可能情况么,我调试了下,代码走的RequestMappingHandlerMapping里面去获取值,感觉这个配置根本就没作用.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics