2011-05-03 42 views
2

我的問題是,我有以下網址:如何自定義請求參數分割模式

http://localhost:8080/shiSolrClient/app/shi/search?q=xyz&fq=author:"Max, Muster" 

我有這些requestParameters的映射豆:

public class SearchParams { 

    private String q = ""; 
    private String[] fq; 

    // getters goes here... 
} 

我的問題是,春天自動分割逗號上的fq參數。所以在我的豆有兩個字符串fq:

String[0]: author:"Max 
String[1]: Muster" 

我不希望這種行爲。我想要的是告訴Spring在'&'上分裂 - '不在',' - 令牌之上。例如。

http://localhost:8080/shiSolrClient/app/shi/search?q=xyz&fq=author:"Max, Muster"&content:"someContent" 

fq=  
String[0]: author:"Max, Muster" 

String[1]: content:"someContent" 

誰能告訴我如何在Spring MVC歸檔此3

我的控制器如下:

@RequestMapping(value = "search", method = RequestMethod.GET) 
public String search(SearchParams searchParams, BindingResult bindResult, Model 
    model) { 

    SolrQuery solrQ = getBasicQuery(searchParams).setQuery(searchParams.getQ()); 
    for(String fq : searchParams.getFq()) { 
     solrQ.setParam("fq", fq); 
    } 
    try { 
     QueryResponse rsp = getSolrServer().query(solrQ); 
     model.addAttribute("solrResults", transformResults(rsp.getResults(), 
      rsp.getHighlighting(), searchParams, rsp)); 
     model.addAttribute("facetFields", transformFacets(rsp.getFacetFields(), 
      rsp.getFacetDates(), searchParams)); 
     model.addAttribute("pagination", calcPagination(searchParams, 
      rsp.getResults())); 
    ... 
} 

我的彈簧配置看起來是這樣的:

<!-- Enables the Spring MVC @Controller programming model --> 
<annotation-driven /> 

<!-- Handles HTTP GET requests for /resources/** --> 
<resources mapping="/resources/**" location="/resources/" /> 

<!-- Configure Apache Tiles for the view --> 
<beans:bean id="tilesConfigurer" 
     class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
    <beans:property name="definitions"> 
      <beans:list> 
     <beans:value>/WEB-INF/views/layout/layouts.xml</beans:value> 
     <beans:value>/WEB-INF/views/hitlist/views.xml</beans:value> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

<beans:bean id="viewResolver" 
      class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <beans:property name="requestContextAttribute" value="requestContext"/> 
    <beans:property name="viewClass" 
      value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
</beans:bean> 

<beans:bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <beans:property name="basenames"> 
     <beans:list> 
     <beans:value>global</beans:value> 
     <beans:value>hitlist</beans:value> 
     <beans:value>local/messages</beans:value> 
     </beans:list> 
    </beans:property> 
</beans:bean> 

    <!-- Scans within the base package of the application for @Components to configure 
      as beans --> 
<context:component-scan base-package="com.shi.solrclient.web" /> 
+0

你能告訴我們你的控制器代碼嗎? – 2011-05-03 19:03:21

回答

0

因爲沒有人想出了一個「正確」的答案,你的最簡單的方法可能是沒有得到春在所有分裂的參數,而是在getter方法添加拆分邏輯:

public class SearchParams { 

    private String q = ""; 
    private String fq; 

    public String[] getSplitFq() { 
     // split and return the array 
    } 
} 

這可能比試圖說服Spring遵循自己的規範更容易。

2

我跑進嘗試使用與列表中@RequestParameter類似的問題(它一直得到以逗號斬。

我想出瞭解決的辦法是在我的控制方法,它允許使用的WebRequest參數。我使用request.getParameterValues( 「blar」)

@RequestMapping(value = "search", method = RequestMethod.GET) 
public String search(WebRequest req, BindingResult bindResult, Model model) { 
    String[] searchParams = req.getParameterValues("fq") 
0

您可以使用@InitBinder註解來配置陣列結合這樣的事情應該工作:

@InitBinder("fq") 
public void fqBinderInit(WebDataBinder binder) { 
    binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor("&")); 
} 

您可以閱讀Spring MVC documentation

1

更詳細的說明註冊一個自定義編輯器的String []所建議的尤金不起作用,因爲的String []的任何自定義編輯器在使用前轉換成字符串由CollectionToStringConverter。

爲了使用另一個除逗號分隔符(即CollectionToStringConverter默認行爲),您需要添加自己的自定義轉換器,如Spring MVC reference documentation中所述。

<bean id="conversionService" 
     class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <set> 
      <bean class="example.MyCustomCollectionToStringConverter"/> 
     </set> 
    </property> 
</bean> 

爲了實現MyCustomCollectionToStringConverter,你不能延長CollectionToStringConverter,因爲它是最後的,但你可以看看到its source code創建自己的。

final class MyCustomCollectionToStringConverter implements ConditionalGenericConverter { 

    private static final String DELIMITER = "&"; 

    private final ConversionService conversionService; 

    public MyCustomCollectionToStringConverter(ConversionService conversionService) { 
     this.conversionService = conversionService; 
    } 

    @Override 
    public Set<ConvertiblePair> getConvertibleTypes() { 
     return Collections.singleton(new ConvertiblePair(Collection.class, String.class)); 
    } 

    @Override 
    public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { 
     return ConversionUtils.canConvertElements(sourceType.getElementTypeDescriptor(), targetType, this.conversionService); 
    } 

    @Override 
    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { 
     if (source == null) { 
      return null; 
     } 
     Collection<?> sourceCollection = (Collection<?>) source; 
     if (sourceCollection.size() == 0) { 
      return ""; 
     } 
     StringBuilder sb = new StringBuilder(); 
     int i = 0; 
     for (Object sourceElement : sourceCollection) { 
      if (i > 0) { 
       sb.append(DELIMITER); 
      } 
      Object targetElement = this.conversionService.convert(sourceElement, sourceType.elementTypeDescriptor(sourceElement), targetType); 
      sb.append(targetElement); 
      i++; 
     } 
     return sb.toString(); 
    } 

} 
+0

您提到的'ConversionServiceFactoryBean'配置對我無效,因爲'MyCustomCollectionToStringConverter'具有參數化而不是默認構造函數。我剛剛在'afterPropertiesSet()'方法中添加了'registry.addConverter(new MyCustomCollectionToStringConverter(this.getObject()));' – Chris 2014-11-18 13:48:56

相關問題