2010-06-15 16 views
5

Ho cercato di seguire this example e di usare the reference per guidarmi, ma non sto avendo fortuna.come registrare un servizio di conversione personalizzato in primavera 3/webflow 2?

ho definito un convertitore:

import org.springframework.binding.convert.converters.StringToObject; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.text.ParseException; 
import java.util.Date; 

public class StringToDateTwoWayConverter extends StringToObject { 
    private DateFormat format = null; 

    public StringToDateTwoWayConverter() { 
     super(StringToDateTwoWayConverter.class); 
     format = new SimpleDateFormat("MM/dd/yyyy"); 

    } 

    @Override 
    protected Object toObject(String string, Class targetClass) throws Exception { 
     Date date = null; 
     try { 
      date = format.parse(string); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     return date; 
    } 

    @Override 
    protected String toString(Object object) throws Exception { 
     Date date = (Date) object; 
     return format.format(date); 
    } 
} 

e un conversionService:

import org.springframework.binding.convert.service.DefaultConversionService; 
import org.springframework.stereotype.Component; 

@Component("conversionService") 
public class ApplicationConversionService extends DefaultConversionService 
{ 
    @Override 
    protected void addDefaultConverters() { 
     super.addDefaultConverters();   
     this.addConverter(new StringToDateTwoWayConverter()); 
     this.addConverter("shortDate", new StringToDateTwoWayConverter()); 

    } 
} 

e configurato:

<mvc:annotation-driven conversion-service="conversionService" /> 
<webflow:flow-builder-services id="flowBuilderServices" conversion-service="conversionService" .../> 

(istanziazione esplicita mostra lo stesso errore)

Tuttavia, all'avvio, che sto accolti con questa eccezione:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name '(inner bean)': Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.core.convert.ConversionService]: Could not convert constructor argument value of type [com.yadayada.converter.ApplicationConversionService] to required type [org.springframework.core.convert.ConversionService]: Failed to convert value of type 'com.yadayada.converter.ApplicationConversionService' to required type 'org.springframework.core.convert.ConversionService'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [com.yadayada.converter.ApplicationConversionService] to required type [org.springframework.core.convert.ConversionService]: no matching editors or conversion strategy found 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:687) 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:195) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:993) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:897) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270) 
    ... 60 more 

sto bene perplesso perché non il suo lavoro. Il servizio di conversione implementa ConversionService tramite la sua classe base, quindi non vedo il problema. Qualche idea molto apprezzata!

In risposta ad una risposta di seguito, ho provato a cambiare il servizio per implementare l'altro servizio di conversione:

import org.springframework.stereotype.Component; 
import org.springframework.core.convert.ConversionService; 

import org.springframework.format.support.FormattingConversionService; 

@Component ("conversionService") 
public class ApplicationConversionService extends FormattingConversionService implements org.springframework.core.convert.ConversionService 
{ 
    public ApplicationConversionService() { 
     this.addConverter(new StringToDateConverter2()); 

} 
} 

Ma ora fallire il contrario:

Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.yadayada.converter.ApplicationConversionService] to required type [org.springframework.binding.convert.ConversionService] for property 'conversionService': no matching editors or conversion strategy found 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:291) 
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:155) 
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:461) 
    ... 86 more 

risposta

9

Spring MVC e Spring WebFlow utilizza diverse gerarchie di convertitori di tipi. Quindi, <mvc:annotation-driven ...> richiede org.springframework.core.convert.ConversionService, ma <webflow:flow-builder-services ...> richiede org.springframework.binding.convert.ConversionService.

+2

Grazie! Questo ha risolto il problema. Ho appena rimosso il bit "" perché sono principalmente preoccupato per l'associazione dei moduli nel flusso web e meno nel normale mondo MVC. Ora, il codice originale funziona senza errori. – nont

0

Nel codice sopra è necessario scrivere super(Date.class) anziché super(StringToDateTwoWayConverter.class).

Problemi correlati