在被遮蔽的领域的春天安装员射入

时间:2017-09-25 08:12:45

标签: java spring

我想隐藏一个变量,并在其子类中将其类型从布尔值更改为字符串。然而,二传手注射失败了。我知道使用阴影是一种不好的做法,但我想知道它是否可能以及如何。

我想做的例子:

public class A {

    public boolean field;

    @SuppressWarnings("javadoc")
    public boolean isField() {

        return field;
    }

    @SuppressWarnings("javadoc")
    public void setField(boolean field) {

        this.field = field;
    }
}

我想将属性'field'视为子类中的String。

public class B extends A {

    private String field;

    @SuppressWarnings("javadoc")
    public String getField() {

        return field;
    }

    @SuppressWarnings("javadoc")
    public void setField(String field) {

        this.field = field;
    }
}

我得到一个异常,即setter Injection不起作用:

org.springframework.beans.TypeMismatchException:无法将类型[java.lang.String]的属性值转换为属性“field”的必需类型[boolean]

<bean id="exampleBean" class="B" >
                <property name="field" value="value"/>
            </bean>

1 个答案:

答案 0 :(得分:0)

虽然我没有测试过。但您可以尝试以下方式。

<bean id="beanA" class="A">
    <property name="field" value="false"></property>
</bean>
<bean id="beanB" parent="beanA" class="B">
    <property name="field" value="anyValue"></property>
</bean>

让我知道它是否适合你。

修改 -

请浏览Bean definition inheritance doc。

我已经测试了您正在使用的阴影字段的示例。您还必须为父类配置bean,因为如果您只为子类配置bean,则会在下面获得异常 -

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'helloWorld' is defined

我不知道你要使用所谓的阴影字段来完成什么。但在这里,我创建了一个可以帮助你的工作示例。看看吧。

<强> MainApp.java

package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String args[]){
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

        HelloWorld hw = (HelloWorld) context.getBean("helloWorld");
        System.out.println("Is message:" + hw.isMsg());

        HelloCountry hc = (HelloCountry) context.getBean("helloCountry");
        System.out.println("Message:" + hc.getMessage());

    }
}

class HelloWorld {
    private boolean message;

       public void setMessage(boolean message){
          this.message  = message;
       }

       public boolean isMsg(){
           return message;
       }
}

class HelloCountry extends HelloWorld {
    private String message;

       public void setMessage(String message){
          this.message  = message;
       }

       public String getMessage(){
           return message;
       }
}

<强>的beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <!-- A parent class bean must be defined to create its instance -->
   <bean id = "helloWorld" class = "com.example.HelloWorld">
      <property name = "message" value = "false"/>
   </bean>

   <bean id = "helloCountry" class = "com.example.HelloCountry">
      <property name = "message" value = "Hello Country!!!"/>
   </bean>

</beans>

<强>输出

enter image description here

注意 -

只有在父boolean中传递bean以外的任何值时,才会收到以下异常。在您的情况下,子类字段的数据类型与注入的bean值匹配,但您必须为父类配置bean。简而言之,就Dependency Injection .-

而言,这是Inheritance的工作原理
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'boolean' for property 'message';

如果有帮助,请告诉我。