2012-02-23 2 views
4

に[java.lang.Stringで]型の値を変換できません、私のフォームです:春のフォームバインディング方法は?ここで必要なタイプ

public class FooDTO 
{ 
    private Country country; 
//getters and setters present 
} 

選択オプションのデフォルトは国値に:ここ

<form:form modelAttribute="fooDTO"> 
fooCountry: 
<form:select path="country"> 
    <form:options items="${countries}" itemLabel="shortName" itemValue="id"/> 
</form:select> 

は、バッキングPOJOでありますfooDTOでは良いです。しかし、バインディングは、フォームを送信するときに失敗します - 私はaformentionedエラーを取得、バインダーにカスタムエディタを登録する必要がありますか、またはより簡単な方法はありますか?国はあなたの予想どおりで、実際には国はコントローラに設定されている国のリストです。

答えて

3

Spring 3ではこれを非常に簡単に行うConverter SPIが導入されました。ドキュメントからソースを取り、あなたの国に入れdocumentation

で6.5を見て、あなたは、コンバータを構成しますXML設定に続いて

package my.converter; 

final class StringToCountry implements Converter<String, Country> { 
    public Country convert(String source) { 
     return // whatever you do to get a country from your string 
    } 
} 

ような何かをするだろう

<bean id="conversionService" 
     class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <list> 
      <bean class="my.converter.StringToCountry"/> 
     </list> 
    </property> 
</bean> 

GriffeyDogが指摘しているように、CountryオブジェクトのtoString()によって返されるものの代わりに、国別IDまたは何かを取得できるように、国IDを選択パスに入れることができます。

+0

と_java.lang.Stringの@ javax.persistence.OneToMany java.util.Set _? – SaganTheBest

1

問題は、SpringがStringのインスタンスを参照していますが、Countryのインスタンスが必要であることがわかります。それは、デフォルトでどのように一方から他方に到達するかを「知っている」わけではありません。

私は以前にSpringフォームバインディングを使用していませんでしたが、これはSpringフレームワーク自体で遭遇する可能性がある同じ問題のようです。後者の場合はregistering a PropertyEditor implementation for your classで解決しますので、同様のアプローチがここではうまくいくと思います。あなたは、コンバータインタフェースを実装する必要がありますhttp://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html#format-configuring-FormattingConversionService

:春にはあなたも

ConversionService

を使用することができます

+0

ええ、私は今、それを掘りしています。時には、春のドキュメントは、かなり浸透している、彼らはほとんどあまりにも多くのオプションを提供しています... – NimChimpsky

1

ここでのドキュメントです。

5

パスを<form:select path="country.id">に変更してください。それは投稿時にCountryオブジェクト内に少なくともidフィールドを示します。

1

私の解決策を見てみましょう:

public class CompanyIdToInstanceConverter implements Converter<String, Company> { 

@Autowired 
CompanyService _companyService; 

@Override 
public Company convert(final String companyIdStr) { 
    return _companyService.find(Long.valueOf(companyIdStr)); 
} 

} 

これは、DBからそれを取得することにより、当社への選択から企業IDを変換します。ご不明な点がございましたら

は今、私は私のアプリで同様のことをやっているので、お問い合わせください:)

をさらにアプリコンテキストに追加する必要があります。

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

<!-- conversion service --> 
<bean id="conversionService" 
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
    <property name="converters"> 
     <set>toryLabelConverter"></bean> 
      <bean class="pl.greenpath.converter.CompanyIdToInstanceConverter"></bean> 
     </set> 
    </property> 
</bean> 
0

あなたがいる場合MVCアプリケーションで作業している場合、アプリケーションコンテキストを設定する方法については、Springソースフォーラムのリンクを参照してください。詳細はスレッドの最下部にあります。

conversionServiceクラスはMVCと異なり、mvc:annotation-driven(アノテーションを使用していなくても)を指定する必要があります。

http://forum.springsource.org/showthread.php?84003-Converters-no-matching-editors-or-conversion-strategy-found

あなたは春のドキュメントで詳細を見つける: http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/validation.html#format-configuring-formatting-mvc

関連する問題