0

こんにちは専門家、私のケースが正しく機能していない理由を知りたいです。
状況: AbstractCheckoutStepValidator
というクラスがあり、そのxml 構成は次のとおりです。

<bean id="abstractCheckoutStepValidator" class="...checkout.steps.validation.AbstractCheckoutStepValidator" abstract="true">
  <property name="checkoutFlowFacade" ref="checkoutFlowFacade"/>
  <property name="checkoutFacade" ref="checkoutFacade"/>
</bean>

そしてコード:

public abstract class AbstractCheckoutStepValidator implements CheckoutStepValidator
{
    private CheckoutFacade checkoutFacade;
    private CheckoutFlowFacade checkoutFlowFacade;

    @Override
    public abstract ValidationResults validateOnEnter(final RedirectAttributes redirectAttributes);

    @Override
    public ValidationResults validateOnExit()
    {
        return ValidationResults.SUCCESS;
    }

    public CheckoutFacade getCheckoutFacade()
    {
        return checkoutFacade;
    }

    @Required
    public void setCheckoutFacade(final CheckoutFacade checkoutFacade)
    {
        this.checkoutFacade = checkoutFacade;
    }

    public CheckoutFlowFacade getCheckoutFlowFacade()
    {
        return checkoutFlowFacade;
    }

    @Required
    public void setCheckoutFlowFacade(final CheckoutFlowFacade checkoutFlowFacade)
    {
        this.checkoutFlowFacade = checkoutFlowFacade;
    }

}

ここに、 AbstractCheckoutStepValidatorを拡張し、ゲッターをオーバーライドするDefaultMultiStepCheckoutStepValidatorクラスがあります。

public class DefaultMultiStepCheckoutStepValidator extends AbstractCheckoutStepValidator {
    private static final Logger LOGGER = Logger.getLogger(DefaultMultiStepCheckoutStepValidator.class);

    @Resource(name = "companyCheckoutFacade")
    private CompanyCheckoutFacade companyCheckoutFacade;


    // omitted code


    @Override
    public CompanyCheckoutFacade getCheckoutFacade() {
        return companyCheckoutFacade;
    }
}

このクラスの xml 構成:

<bean id="defaultMultiStepCheckoutValidator" class="...checkout.steps.validation.impl.DefaultMultiStepCheckoutStepValidator" parent="abstractCheckoutStepValidator" />

技術的な観点からは問題ありません。ゲッターが親クラスを返す場合、私の場合はそのサブクラスの 1 つを使用できます。それはCompanyCheckoutFacade extends CheckoutFacadeです。(私はここのような同様の例を持っています:

@Override
protected CompanyCartFacade getCartFacade() {
    return (CompanyCartFacade) super.getCartFacade();
}

しかし、ここでは、返された Bean をこのサブクラスにキャストできると確信しています。そのため、親クラスからゲッターを呼び出しており、このゲッターは親クラスでもサブクラスでも正常に動作します)
また、コードでは、アノテーションであり、このフィールドは親クラスの checkoutFacade フィールドとは関係ありません...上記のコードでサーバーを起動すると、次のエラーが発生しました。

Error creating bean with name 'defaultMultiStepCheckoutValidator' defined in ServletContext resource [/WEB-INF/config/multi-step-checkout-config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '...order.impl.DefaultCheckoutFacade' to required type '...facades.order.CompanyCheckoutFacade' for property 'checkoutFacade'; nested exception is java.lang.IllegalStateException: Cannot convert value of type '...order.impl.DefaultCheckoutFacade' to required type '...facades.order.CompanyCheckoutFacade' for property 'checkoutFacade': no matching editors or conversion strategy found
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.lambda$resolveManagedMap$1(BeanDefinitionValueResolver.java:453) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[?:?]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedMap(BeanDefinitionValueResolver.java:451) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:181) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1697) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1442) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.lambda$resolveManagedMap$1(BeanDefinitionValueResolver.java:453) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[?:?]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedMap(BeanDefinitionValueResolver.java:451) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:181) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1697) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1442) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeanByName(AbstractAutowireCapableBeanFactory.java:453) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:527) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:497) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:650) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:239) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:318) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
        ... 27 more


質問:
上記のエラーから、Spring がタイプ '...order.impl.DefaultCheckoutFacade' のプロパティ値をプロパティ 'checkoutFacade' の必要なタイプ '...facades.order.CompanyCheckoutFacade' に変換しようとする理由がよくわかりません. ゲッターのどこにも checkoutFacade プロパティを使用していません。 DefaultCheckoutFacadeCheckoutFacadeインターフェイスのデフォルトの実装であり、xml 構成の checkoutFacade 参照が正しい実装を参照していると確信しています。

<alias name="defaultCheckoutFacade" alias="checkoutFacade"/>
<bean id="defaultCheckoutFacade" class="...order.impl.DefaultCheckoutFacade">
    // properties are omitted
</bean>

私のクラスでは、ゲッターは異なる実装を返す必要があると言っています。それだけです。このエラーを取り除くには、getter の名前を変更し、親クラスのものをオーバーライドしないようにする必要がありますが、getter をオーバーライドするアプローチが機能しない理由がわかりません。

お時間を割いていただき、質問にお答えいただきありがとうございます。

4

0 に答える 0