2016-04-15 11 views
1

私はあなたのようなPOJOを取得リクエストパラメータをバインドすることができます知っている:/予約:リクエストに春REST - ネストされたオブジェクトにGETパラメータを結合

public class ReservationCriteria { 
    String hotelName; 

    DateRange reservationDateRange; 
    //getters-setters omitted 
} 

:のようなPOJOを使用して

@RequestMapping(value = "/reservation", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
public List<Reservation> loadReservations(ReservationCriteria criteria) 

    return service.loadReservations(criteria); 
} 

?hotelName = myHotel

myHotelはReservationCriteriaオブジェクトのhotelNameにバインドされます。

しかし、どのようにパラメータをネストされたオブジェクトDateRangeにバインドできますか?

/reservation?hotelName=myHotel&reservationDateRange={fromDate=14.04.2016,toDate=15.04.2016} 

または私は別々のリクエストパラメータを宣言し、それらを手動でバインドする必要があります:どのように定義:ようなものを結合のようなものを可能にするURLパターンは

public class DateRange { 
    Date from; 
    Date to; 

    //getters-setters omitted 
} 

ありますか?

@RequestMapping(value = "/reservation", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
public List<Reservation> loadReservations(
    ReservationCriteria criteria, 
    @RequestParam Date from, 
    @RequestParam Date to) 

    DateRange range = new DateRange(); 
    range.setFrom(from); 
    range.setTo(to); 

    criteria.setDateRange(range); 

    return service.loadReservations(criteria); 
} 

それは他の多くのプロジェクトで使用されているので、私はリファクタリングの多くを行うことが原因と思われる、ReservationCriteriaクラスを変更しないことを好むだろう。

答えて

2

POJOをデータのコンテナとして渡すとき、Springはプロパティの名前を使用してクエリ文字列を作成し、渡されたデータは適切なコンバータを介してpojoを構築します。これは、平面のpojoまたは他の言葉でネスティングなしで動作します。この目的のために、コンバータを用意してください。

public class ReservationCriteria { 
    String hotelName; 

    Date from; 
    Date to; 
    //getters-setters omitted 
} 

@RequestMapping(value = "/reservation", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
public List<Reservation> loadReservations(ReservationCriteria criteria) 

    return service.loadReservations(criteria); 
} 

/予約=ヴァル&へ= valの

からhotelName =値&あなたはSpringMVCの標準コンバータの恩恵を受けることができ、このように:?このような理由のために、あなたは以下のように考えていコールド。

codificateにjsonの並べ替えを使用しようとすると、内部オブジェクトが機能しませんでした。なぜなら、このクエリではデフォルトでSpringがこのプレゼンテーションを理解していないからです。ベンコメントにanswareため

更新:

あなたがorg.springframework.core.convert.converter.Converter<S, T>を実装して、春の変換サービスであなたの新しいコンバータを登録したカスタムコンバータを実装したい場合。

XML設定では、あなたはFormattingConversionServiceFactoryBeanを使用することができ、以下のようにMVCの名前空間でそれを登録します。javaの設定上の

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <mvc:annotation-driven conversion-service="conversionService"/> 

    <context:component-scan base-package="com.springapp.mvc"/> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/pages/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 


    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
     <property name="converters"> 
      <util:list> 
       <bean class="com.springapp.mvc.DateRangeToStringConverter"/> 
       <bean class="com.springapp.mvc.StringToDateRangeConverter"/> 
      </util:list> 
     </property> 
    </bean> 
</beans> 

あなたはWebMvcConfigurerAdapter拡張することができますし、以下のようにベナ追加:

@Configuration 
@EnableWebMvc 
public class YourWebConfigurationClass extends WebMvcConfigurerAdapter{ 

    @Override 
    public void addFormatters(FormatterRegistry formatterRegistry) { 
     formatterRegistry.addConverter(yourConverter()); 
    } 

    ... 

} 

あなたコンバータは以下のようになります。

public class DateRangeToStringConverter implements Converter<DateRange,String> { 

    @Override 
    public String convert(DateRange dateRange) { 
     return Json.createObjectBuilder().add("fromDate",DateFormatData.DATE_FORMAT.format(dateRange.getFrom())) 
       .add("toDate", DateFormatData.DATE_FORMAT.format(dateRange.getTo())) 
       .build() 
       .toString(); 
    } 

} 



public class StringToDateRangeConverter implements Converter<String,DateRange> { 


    @Override 
    public DateRange convert(String dateRange) { 
     DateRange range = new DateRange(); 
     JsonObject jsonObject = Json.createReader(new StringReader(dateRange)).readObject(); 

     try { 
      range.setFrom(DateFormatData.DATE_FORMAT.parse(jsonObject.getString("fromDate"))); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     try { 
      range.setTo(DateFormatData.DATE_FORMAT.parse(jsonObject.getString("toDate"))); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     System.out.println(range); 
     return range; 
    } 

} 

このようにして、あなたはURLでリストすることができます:http://localhost:8080/reservation?hotelName=myHotel&reservationDateRange={"fromDate":"14.04.2016","toDate":"15.04.2016"}

pleas支払予約受付時のDateRangeフィールドは、jsonのようにエンコードしたものです。

私はそれはそれはリファクタリングの多くを行うことが原因となる他の多くのプロジェクトで使用されているので、私はReservationCriteriaクラスを編集したくないあなた

+0

助けることができることを願っています。 – Reek

+0

予約する場合は、予約を変更して登録するだけです。 –

+0

あなたはコンバータを提供する方法を詳しく教えていただけますか? – benaich

関連する問題