yan*_*kee 14 spring spring-mvc
在基于Spring 3的Web(portlet)应用程序中,我有一个控制器,其方法如下:
@RenderMapping
public ModelAndView handleRenderRequest(...,@RequestParam MyClass myObject)
{
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道:我如何告诉spring如何将请求参数转换为MyClass.我找到了有关属性编辑器和Converter接口的信息,似乎有一些影响,转换器是属性编辑器的继承者,但似乎没有人喜欢明确它.
我实现了String到MyClass转换的转换器接口.但是我如何告诉Spring呢?我尽可能使用基于注释的配置,所以我检查spring是否会自动从类路径中检测到Converter,但事实并非如此.
因此,从手册中配置ConversionService的部分想告诉我,我必须将以下内容添加到我执行的applicationContext.xml中:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="some.package.MyConverter"/>
</list>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
还是有点:
org.springframework.beans.ConversionNotSupportedException:无法转换值[...]
那我错过了什么?有没有办法,只需配置一个包,让Spring扫描这个包转换器并自动注册?并且说,在某种方法中,我想使用与所有其他方法不同的转换器.例如,我想要一个检查Luhn-Checksum的整数并删除校验和,我该怎么做?像@RequestParam(converter = some.package.MyConverter.class)之类的东西会很棒.
好的,我刚收到文档:
当您在客户端环境(例如Web应用程序)中工作时,请使用Formatter SPI,并且需要解析和打印本地化的字段值
所以我想这意味着我应该使用Formatter SPI,这是属性编辑器和转换器旁边的第三种可能性(我认为我可以使用比较表等).我也实现了Parser接口,并尝试使用以下命令注册我的转换器:
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="some.package.SortOrderEnumConverterSpring"/>
</set>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用"set"而不是"list"来指定转换器.我在FormattingConversionServiceFactoryBean.setConverters方法中设置了一个调试断点,该方法在使用list时没有触发,但它确实触发了使用set.
另外我补充道
<mvc:annotation-driven conversion-service="conversionService"/>
Run Code Online (Sandbox Code Playgroud)
以及我的applicationContext的mvc-prefix的命名空间.但我仍然得到转换不支持的异常.
我还尝试回到转换器方法,并在我的applicationContext.xml文件中更改了从列表到设置的转换器的参数列表,但这也没有改变任何东西.
正如digitaljoel指出的那样,可以使用initBinder方法为每个控制器设置不同的转换器.我将它应用于我的控制器:
@Autowired
private ConversionService conversionService;
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.setConversionService(conversionService);
}
Run Code Online (Sandbox Code Playgroud)
在我的applicationContext.xml中:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="some.package.with.MyConverter"/>
</set>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
突然之间转换工作正常:-).但我不太高兴不得不将其应用于我的每一个控制器.必须有一种方法可以在我的applicationContext中为每个人设置它,不是吗?很高兴知道我可以覆盖默认,如果我需要(毕竟我要求),但我仍然想设置默认值.
格式化程序的东西怎么样?我不应该使用它而不是转换器吗?
您是正确的,Converter(和 ConverterFactory)是属性编辑器的继承者。您的问题可能是您不接受适当的类型作为转换器的参数,但在没有看到转换器代码的情况下很难说。如果您期望 Long 或 Integer,您实际上可能从 Spring 获取 String,并且需要首先自己执行该键转换。
至于配置,我相信您需要在 xml 的 bean 配置中列出所有转换器。如果您使用 @Component 注释转换器实现,您可能可以通过 bean 名称而不是完全限定路径来引用它,但我只尝试过对 ConverterFactory 而不是转换器。
最后,在特定的转换器上,您似乎可以在控制器级别配置转换服务(请参阅 Javi 关于为基于注释的 Spring MVC 控制器设置混合配置的回答),然后您可以只放置该方法(并且其他需要该控制器的控制器)到使用辅助转换服务的控制器中,您应该能够使用 @Resource 注释按名称注入该服务。
归档时间: |
|
查看次数: |
15177 次 |
最近记录: |