2016-01-26 21 views
8

私はプログラム的に春のブートプロジェクトに春のコンバータを登録したいです。過去の春のプロジェクトで、私は 春ブーツで登録春コンバータプログラム

<!-- Custom converters to allow automatic binding from Http requests parameters to objects --> 
<!-- All converters are annotated w/@Component --> 
<bean id="conversionService" 
     class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <list> 
      <ref bean="stringToAssessmentConverter" /> 
     </list> 
    </property> 
</bean> 

が、私は春ブーツのSpringBootServletInitializerで行う方法を把握しようとしている...このようなXMLでそれをやった

を更新:は私が作りましたgetConversionServiceに引数としてStringToAssessmentConverterを渡すことが、今、私はなっていないんだことにより、ほとんど進展StringToAssessmentConverterクラスのエラーを「いいえデフォルトコンストラクタが見つかりました」。私はなぜSpringが@Autowiredコンストラクタを見ていないのか分かりません。ここConverterのコードだ

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    ... 

    @Bean(name="conversionService") 
    public ConversionServiceFactoryBean getConversionService(StringToAssessmentConverter stringToAssessmentConverter) { 
     ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean(); 

     Set<Converter> converters = new HashSet<>(); 

     converters.add(stringToAssessmentConverter); 

     bean.setConverters(converters); 
     return bean; 
    } 
} 

...

@Component 
public class StringToAssessmentConverter implements Converter<String, Assessment> { 

    private AssessmentService assessmentService; 

    @Autowired 
    public StringToAssessmentConverter(AssessmentService assessmentService) { 
     this.assessmentService = assessmentService; 
    } 

    public Assessment convert(String source) { 
     Long id = Long.valueOf(source); 
     try { 
      return assessmentService.find(id); 
     } catch (SecurityException ex) { 
      return null; 
     } 
    } 

} 

全エラー

ゴールorg.springframework.bootの実行に失敗しました:春・ブートのmaven-pluginのを:1.3.2 .RELEASE:プロジェクトでrun(default-cli)を実行しました。yrdstick:実行中に例外が発生しました。 null:InvocationTargetException: 'org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor'という名前のBeanを作成中にエラーが発生しました:initメソッドの呼び出しに失敗しました。ネストされた例外はorg.springframework.beans.factory.UnsatisfiedDependencyExceptionです:me.jpolete.yrdstick.Applicationで定義された 'conversionService'という名前のBeanを作成中にエラーが発生しました:[me.jpolete.yrdstick.websupportのインデックス0のコンストラクタ引数で表されている満足度の低い依存関係.StringToAssessmentConverter]::ファイル '/yrdstick/target/classes/me/jpolete/yrdstick/websupport/StringToAssessmentConverter.class'に定義された 'stringToAssessmentConverter'という名前のBeanを作成中にエラーが発生しました:Beanのインスタンス化に失敗しました。 [me.jpolete.yrdstick.websupport.StringToAssessmentConverter]インスタンス化しないために失敗しました::ネストされた例外はorg.springframework.beans.BeanInstantiationExceptionでは見つかりませんデフォルトコンストラクタを。ネストされた例外はjava.lang.NoSuchMethodExceptionです:me.jpolete.yrdstick.websupport.StringToAssessmentConverter();。入れ子にされた例外はorg.springframework.beans.factory.BeanCreationExceptionです:ファイル '/yrdstick/dev/yrdstick/target/classes/me/jpolete/yrdstick/websupport/StringToAssessmentConverter.class]に定義された' stringToAssessmentConverter 'という名前のBeanを作成中にエラーが発生しました:インスタンス化豆の失敗。ネストされた例外はorg.springframework.beans.BeanInstantiationException:インスタンス化に失敗しました[me.jpolete.yrdstick.websupport.StringToAssessmentConverter]:デフォルトコンストラクタが見つかりませんでした。ネストされた例外はjava.lang.NoSuchMethodExceptionです。me.jpolete.yrdstick.websupport.StringToAssessmentConverter()

+0

このようにしてみてください。converters.add(new StringToAssessmentConverter()); – Shaheer

+0

@Shaheer私はそれを新しいものとインスタンス化することはできません。 StringToAssessmentConverterはそれ自身のAutowired依存関係を持っています。 – jpolete

答えて

11

あなたのコンバータには、@Componentとアノテーションを付ける必要があります。

これは私のコンバータの例です

import org.springframework.core.convert.converter.Converter; 
@Component 
public class DateUtilToDateSQLConverter implements Converter<java.util.Date, Date> { 

    @Override 
    public Date convert(java.util.Date source) { 
     return new Date(source.getTime()); 
    } 
} 

次に、変換する必要があるときにコンバーターが呼び出されます。

マイ春ブートバージョン:ここで1.4.1

+1

これに言及してくれてありがとう。 unfortunatellyこれは春の文書ではどこにも書かれていません。 – eav

+0

@eav true、これは有用で使いやすいものであり、文書化する必要があります – deFreitas

+0

非常に遅れて返信して申し訳ありません。あなたは正しい。 @Componentで注釈を付けるだけです。以前のバージョンのSpring Bootに問題があったかどうか、または他の問題があったかどうかは不明です。これを正しいとマークしてください。 – jpolete

0

これを試してみてください。

@Autowired 
@Bean(name="conversionService") 
public ConversionService getConversionService(StringToAssessmentConverter stringToAssessmentConverter) { 
    ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();  
    Set<Converter> converters = new HashSet<Converter>(); 

    //add the converter 
    converters.add(stringToAssessmentConverter); 

    bean.setConverters(converters); 
    return bean.getObject(); 
} 

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    @Bean 
    public AssessmentService assessmentService(){ 
     return new AssessmentService(); 
    } 

    @Bean 
    public StringToAssessmentConverter stringToAssessmentConverter(){ 
     return new StringToAssessmentConverter(assessmentService()); 
    } 

    @Bean(name="conversionService") 
    public ConversionService getConversionService() { 
     ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();  
     Set<Converter> converters = new HashSet<Converter>(); 

     //add the converter 
     converters.add(stringToAssessmentConverter()); 

     bean.setConverters(converters); 
     return bean.getObject(); 
    } 

    // separate these class into its own java file if necessary 
    // Assesment service 
    class AssessmentService {} 

    //converter 
    class StringToAssessmentConverter implements Converter<String, Assessment> { 

     private AssessmentService assessmentService; 

     @Autowired 
     public StringToAssessmentConverter(AssessmentService assessmentService) { 
      this.assessmentService = assessmentService; 
     } 

     public Assessment convert(String source) { 
      Long id = Long.valueOf(source); 
      try { 
       return assessmentService.find(id); 
      } catch (SecurityException ex) { 
       return null; 
      } 
     } 

    } 
} 

をしたり、StringToAssessmentConverterはすでに春の豆であれば

+0

呼び出しているstringToAssessmentConverter()メソッドはどこですか? – jpolete

+0

気にしないでください。そうですか。これはおそらくうまくいくでしょうが、私はSpringのコンポーネントとautowired注釈を、手動でオブジェクトを配線するのではなく、利用したいと思います。 – jpolete

+0

私の更新答えを見てください。基本的に '@ Component'としてクラスに注釈を付けることは、' @ Bean'でメソッドに注釈を付けることと同じです。おかげさまで – MangEngkus

0

は私のソリューションです:

AのTypeConverter注釈:その後、

@Configuration 
public class ConverterConfiguration { 

    @Autowired(required = false) 
    @TypeConverter 
    private Set<Converter<?, ?>> autoRegisteredConverters; 

    @Autowired(required = false) 
    @TypeConverter 
    private Set<ConverterFactory<?, ?>> autoRegisteredConverterFactories; 

    @Autowired 
    private ConverterRegistry converterRegistry; 

    @PostConstruct 
    public void conversionService() { 
     if (autoRegisteredConverters != null) { 
      for (Converter<?, ?> converter : autoRegisteredConverters) { 
       converterRegistry.addConverter(converter); 
      } 
     } 
     if (autoRegisteredConverterFactories != null) { 
      for (ConverterFactory<?, ?> converterFactory : autoRegisteredConverterFactories) { 
       converterRegistry.addConverterFactory(converterFactory); 
      } 
     } 
    } 

} 

そして、あなたのコンバータに注釈を付ける:

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Component 
public @interface TypeConverter { 
} 

Aコンバータレジストラ:

@SuppressWarnings("rawtypes") 
@TypeConverter 
public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> { 

    @SuppressWarnings("unchecked") 
    public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) { 
     return new StringToEnum(targetType); 
    } 

    private final class StringToEnum<T extends Enum> implements Converter<String, T> { 

     private Class<T> enumType; 

     public StringToEnum(Class<T> enumType) { 
      this.enumType = enumType; 
     } 

     @SuppressWarnings("unchecked") 
     public T convert(String source) { 
      return (T) Enum.valueOf(this.enumType, source.trim().toUpperCase()); 
     } 
    } 
} 
+0

私は試してみましたが、エレガントに見えますが、おそらく春バージョンの違いはありますか? org.springframework.beans.factory.BeanCreationException:クラスパスresource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]で定義された 'entityManagerFactory'という名前のBeanを作成中にエラーが発生しました:initメソッドの呼び出しに失敗しました。ネストされた例外はjava.lang.IllegalStateExceptionです:AttributeConverterをインスタンス化できません[void – Espresso

+0

HibernateJpaの自動構成から、あなたはおそらくSpringブートを使用しています。私が知る限り、Spring Bootはすでに自動登録コンバーターをサポートしています:https://stackoverflow.com/questions/35025550/register-spring-converter-programmatically-in-spring-bootこのソリューションは、裸のSpring向けであり、スプリングブート用。 – narduk

関連する問題