Wie registriere ich einen benutzerdefinierten Conversion -Dienst in Spring 3 / Webflow 2?

StackOverflow https://stackoverflow.com/questions/3046451

  •  27-09-2019
  •  | 
  •  

Frage

Ich habe versucht zu folgen Dieses Beispiel und verwenden die Referenz Um mich zu führen, aber ich habe kein Glück.

Ich habe einen Konverter definiert:

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);
    }
}

und ein 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());

    }
}

und konfiguriert es:

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

(Die explizite Instanziierung zeigt den gleichen Fehler an)

Beim Start -up werde ich jedoch mit dieser Ausnahme begrüßt:

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

Ich bin sehr verwirrt, warum es nicht funktioniert. Der Conversion Service implementiert ConversionService über seine Basisklasse, daher sehe ich das Problem nicht. Jede Einsicht sehr geschätzt!

Als Antwort auf eine Antwort unten habe ich versucht, den Dienst zu ändern, um den anderen Conversion -Dienst zu implementieren:

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());

}
}

Aber jetzt scheitere ich in die andere Richtung:

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
War es hilfreich?

Lösung

Spring MVC und Spring Webflow verwendet verschiedene Hierarchien von Typkonvertern. So,<mvc:annotation-driven ...> erfordert org.springframework.core.convert.ConversionService, aber <webflow:flow-builder-services ...> erfordert org.springframework.binding.convert.ConversionService.

Andere Tipps

Im obigen Code sollten Sie schreiben super(Date.class) stattdessen super(StringToDateTwoWayConverter.class).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top