【问题标题】:@PathVariable List<UUID> in Spring MVCSpring MVC 中的@PathVariable List<UUID>
【发布时间】:2012-08-30 02:41:29
【问题描述】:

在 Spring MVC 控制器中,@PathVariable Long... ids 在传递像1,2,3 这样的输入时得到很好的解析。

如果参数声明为@PathVariable UUID... ids,则逗号分隔不起作用:返回 400 响应。

我可以实现自定义PropertyEditor 来处理UUID[]List&lt;UUID&gt; 吗?我能找到的唯一例子是单个值,而不是集合/数组。

更新

根据Phil Webb's answer below,在将问题报告为 Spring JIRA 上的错误后,SpringSource 的好心人在 Spring 3.2 中添加了对此的支持

【问题讨论】:

    标签: java spring spring-mvc propertyeditor path-variables


    【解决方案1】:

    这个问题将在 Spring 3.2 中修复。详情请见https://jira.springsource.org/browse/SPR-9765

    【讨论】:

    • 太棒了!我看到了 JIRA 更新,谢谢。 3.2 有 ETA 吗?
    【解决方案2】:

    您可以通过这种方式注册自定义转换器:

    import org.springframework.core.convert.converter.Converter;
    class UUIDConverter implements Converter<String, UUID> {
    
        @Override
        public UUID convert(String source) {
            return UUID.fromString(source);
        }
    
    }
    

    并使用 Spring MVC 注册它:

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="....UUIDConverter"/>
            </set>
        </property>
    </bean>
    
    
    <mvc:annotation-driven conversion-service="conversionService"> 
    </mvc:annotation-driven>
    

    现在,如果您提交 UUID,它应该会正确映射到列表。

    【讨论】:

    • Spring MVC 已经正确映射了单个 UUID,但这并没有在任何地方提到 List
    • 我的意思是,如果您以这种方式提交 UUID 列表:uuid1、uuid2、uuid3,那么它将正确映射到 List&lt;UUID&gt; 参数。这不是你所期望的吗,那我可能误解了你的问题。
    • 这是一个显示场景的要点 - gist.github.com/3638121 ,这里我绑定到 UUID... (uuid varargs 字段)
    • 非常感谢Biju。我不明白的是,如果没有客户 Converter 实现,Spring MVC 可以绑定一个 UUID 就好了 - 所以在 Spring MVC 框架中的某个地方必须存在一个 UUID 转换器。我没有得到的部分是,只需添加您的自定义Converter,它没有提及列表,框架就会被提示首先使用拆分输入字符串。这可以被认为是 Spring MVC 中的一个错误?
    • 是的,你是对的!我对其进行了更多调试,有一个 org.springframework.beans.propertyeditors.UUIDEditor 在传递单个 UUID 时正确转换,但对于数组则失败。听起来确实像一个错误。
    【解决方案3】:

    对于基于注解的配置,您只需在类中添加@Component 注解

    package com.demo.config.converters;
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.stereotype.Component;
    import java.util.UUID;
    
    @Component
    public class StringToUUIDConvertor
      implements Converter<String, UUID> {
    
        @Override
        public UUID convert(String source) {
            try {
                return UUID.fromString(source);
            }
            // just changing default message to the one I like to see.
            catch (IllegalArgumentException ex){
                throw new IllegalArgumentException("Invalid input UUID string");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 2012-07-06
      • 2013-11-17
      • 1970-01-01
      • 2012-06-08
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多