Spring MVC REST requestParam为同一个键处理多个值

时间:2014-01-03 23:04:01

标签: java spring

我正在进行GET请求,它有2个参数或基本上是数组

param {
paramNo:1,
from:mobile,
to:server
}
param {
paramNo:2,
from:server,
to:mobile
}

在我的控制器中,我已将其捕获为

public  @ResponseBody SearchResponse serverSearch(@RequestParam List<String> param) throws Exception {
     ObjectMapper mapper = new ObjectMapper();
     List<SearchInfo> searchInfo = mapper.readValue(param,new TypeReference<List<SearchInfo>>(){});
}

mapper.readValue不带List。它正在抛出编译错误。

问题

  1. 我更愿意将其检索为(@RequestParam List param)而不是调用objectMapper。我应该怎么做才能直接将其转换为List
  2. 如何将List转换为List?

1 个答案:

答案 0 :(得分:1)

您必须使用arrays instead of lists initially,但您可以轻松地执行:List<SearchInfo> params = Arrays.asList(myArray);

转换JSON

如果您的参数是有效的JSON,如您的示例所示,转换为自定义对象非常简单,请参阅here


转换其他内容

否则,您可以使用Spring创建自定义格式化程序,将格式化来自请求参数的字符串到您的自定义对象中。基本上你必须首先创建一个类来注册要格式化的对象类型以及哪个类进行格式化:

import org.springframework.format.FormatterRegistrar;
import org.springframework.format.FormatterRegistry;

public class SearchInfoFormatterRegistrar implements FormatterRegistrar {
  @Override
  public void registerFormatters(FormatterRegistry registry) {
    registry.addFormatterForFieldType(SearchInfo.class, new SearchInfoFormatter());
  }
}

然后实现执行格式化的类(请注意,这不仅仅是将对象转换为其他类型,实际上您必须使用某些逻辑):

import org.springframework.format.Formatter;

public class SearchInfoFormatter implements Formatter<SearchInfo> {
  @Override
  public String print(SearchInfo info, Locale locale) {
    // Format SearchInfo into String here.
  }

  @Override
  public SearchInfo parse(String text, Locale locale) {
    // Format String into SearchInfo here.
  }
}

最后,您将它们添加到您的配置中:

<bean name="conversionService"
      class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="formatterRegistrars">
        <set>
            <bean class="org.my.SearchInfoFormatterRegistrar" />
        </set>
    </property>
</bean>