2010-11-28 16 views
1

私はちょうど、私は別のオブジェクト型に変換することができますか?URLの文字列を春の複雑なオブジェクト型に変換する方法

@RequestMapping(value="/key/{keyDomain}", method=RequestMethod.GET) 
    public String propertyEditor(@PathVariable(value="keyDomain") KeyDomain key, Model model){ 
     model.addAttribute("key", key); 
     return "propertyEditor"; 
    } 

とここに私の設定

<beans:bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"> 
     <beans:property name="customEditors"> 
      <beans:map> 
       <!-- <beans:entry key="com.template.baseline.domain.KeyDomain" value="com.template.baseline.propertyEditor.KeyPropertyEditor"/> --> 
       <beans:entry key="com.template.baseline.domain.KeyDomain"> 
        <beans:ref bean="keyDomainPropertyEditor" /> 
       </beans:entry> 
      </beans:map> 
     </beans:property> 
    </beans:bean> 

<!-- key domain property editor bean --> 
<beans:bean id="keyDomainPropertyEditor" class="com.template.baseline.propertyEditor.KeyPropertyEditor"> 
    <beans:property name="keyDomain"> 
     <beans:bean class="com.template.baseline.domain.KeyDomain" /> 
    </beans:property> 
</beans:bean> 

とのPropertyEditorクラス:

public class KeyPropertyEditor extends PropertyEditorSupport{ 

    private KeyDomain keyDomain; 

    /** 
    * example : 10435 
    * - 10 will be keyId 
    * - 435 will be baseOfficeId 
    */ 
    @Override 
    public void setAsText(String text) throws IllegalArgumentException{ 
     KeyDomain keyDomain = new KeyDomain(); 
     keyDomain.setKeyId(Integer.parseInt(text.substring(0,1))); 
     keyDomain.setBaseOfficeId(Integer.parseInt(text.substring(2,4)));  
     setValue(keyDomain); 
    } 

    @Override 
    public String getAsText() { 
     KeyDomain value = (KeyDomain) getValue(); 
     return (value != null ? value.toString() : ""); 
    } 

    public void setKeyDomain(KeyDomain keyDomain) { 
     this.keyDomain = keyDomain; 
    } 
} 

私はURI文字列が適切なオブジェクト型になる変換するためのプロパティエディタを使用することができると考えました。私はすでに実装を行い、CustomEditorConfigurerを設定していますが、私はいつもConversionNotSupportedExceptionを取得します。

私は私のコントローラでinitBinder追加した場合、すべてがうまくなります:

@InitBinder 
public void setBinder(WebDataBinder dataBinder) { 
    dataBinder.registerCustomEditor(KeyDomain.class, new KeyPropertyEditor());  
} 

この

がWARNのように、私は何かを警告ます:org.springframework.beans.factory.config.CustomEditorConfigurerを - PropertyEditorインスタンスをCustomEditorConfigurerに渡すことは推奨されません。代わりにPropertyEditorRegistrarsまたはPropertyEditorクラス名を使用してください。違反キー[com.template.baseline.domain.KeyDomain;違反エディタのインスタンス:[email protected]

お返事ありがとうございます。

PS:webBindingInitalizerはAnnotationMethodHandlerAdapterに

を注入し
<beans:bean id="AnnotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <beans:property name="webBindingInitializer"> 
     <beans:bean class="com.template.baseline.initialize.CustomWebBindingInitializer" /> 
    </beans:property> 
</beans:bean> 

と実装

public class CustomWebBindingInitializer implements WebBindingInitializer { 

public CustomWebBindingInitializer(){ 
    System.out.println("******** constructor *********"); 
} 

public void initBinder(WebDataBinder binder, WebRequest request) { 
    System.out.println("******** initBinder *********"); 
    binder.registerCustomEditor(KeyDomain.class, new KeyDomainPropertyEditor()); 
} 

}

+1

あなたは正しい方向に向かっています。「PropertyEditor」が行く方法です。エディタとその設定方法を教えてください。 – skaffman

+0

こんにちはskaffman、私はちょうど、costumEditorConfigurerがBeanの作成時にcostum editorを正確に登録していないことを知りました。 Springのリファレンスでは、「もう少し便利なもう1つのメカニズムは、CustomEditorConfigurerという特殊なBeanファクトリポストプロセッサを使用することです」と述べています。どのように起こることができますか?バグ?または私の間違った理解? –

答えて

1

CustomEditorConfigurerは、Web要求データ・バインディングとは何の関係もありません。

あなたがglobabllyあなたPropertyEditorを登録したい場合は、あなたがWebBindingInitializerを実装し、それをAnnotationMethodHandlerAdapterを供給する必要があります。

<bean 
    class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <proeprty name = "webBindingInitializer"> 
     <bean class = "MyWebBindingInitializer" /> 
    </property> 
</bean> 

別のオプションは、Formatterとしてコンバージョンロジックを実装し、FormattingConversionServiceFactoryBean<mvc:annotation-driven>を経由して、それを設定することですmvc-showcase sampleを参照してください。

+0

答えをいただきありがとうございます。私はspringsource forumを見て、私はその問題を解決する方法を考えています。ありがとう。 –

+0

axtavt、私はあなたが私に言ったやり方をしています。しかし、私はそれを働かせることはできません。明らかにWebBindingInitializer内のinitBinderメソッドは呼び出されません。私はエラーが発生しました(プロパティエディタ[com.template.baseline.domain.KeyDomainEditor]がcom.template.baseline.domain.KeyDomain型の 'Editor'接尾辞規則に従って見つかりません)、同じ名前でPropertyEditorを作成しようとしましたフォルダ。すべてがうまくいく。私はここで何かが恋しいですか?なぜ私はpropertyEditorを登録することができませんglobaly? –

+1

@Swing:上記のように 'AnnotationMethodHandlerAdapter'を設定しましたか? – axtavt

関連する問題