it-swarm.com.de

Spring - legt eine Eigenschaft nur fest, wenn der Wert nicht null ist

Kann bei Verwendung von Spring nur eine Eigenschaft festgelegt werden, wenn der übergebene Wert nicht Null ist?

Beispiel:

<bean name="myBean" class="some.Type">
   <property name="abc" value="${some.param}"/>
</bean>

Das Verhalten, das ich suche, ist:

some.Type myBean = new some.Type();
if (${some.param} != null) myBean.setAbc(${some.param});

Der Grund dafür ist, dass abc einen Standardwert hat, den ich nicht mit einer null..__ überschreiben möchte, und dass die Bean, die ich erstelle, nicht meiner Quellcodeverwaltung unterliegt. (Auch abc könnte für diesen Zweck ein Primitiv sein, daher kann ich es sowieso nicht mit einer Null setzen.

BEARBEITEN:
Nach den Antworten meiner Meinung nach muss meine Frage geklärt werden.

Ich habe eine Bean, die ich instanziieren und an den von mir verwendeten Drittanbieter weitergeben muss. Diese Bean hat viele Eigenschaften (derzeit 12) verschiedener Typen (int, boolean, String usw.).
Jede Eigenschaft hat einen Standardwert - ich weiß nicht, was es ist und würde es nicht vorziehen zu wissen, es sei denn, es wird zu einem Problem. Was ich suche, ist eine generische Lösung, die von Spring 'Fähigkeiten stammt. derzeit habe ich nur eine reflexionsbasierte Lösung.

Aufbau

<bean id="myBean" class="some.TypeWrapper">
   <property name="properties">
     <map>
         <entry key="abc" value="${some.value}"/>
         <entry key="xyz" value="${some.other.value}"/>
         ...
      </map>
   </property>
</bean>

Code

public class TypeWrapper
{
    private Type innerBean;

    public TypeWrapper()
    {
        this.innerBean = new Type();
    }

    public void setProperties(Map<String,String> properties)
    {
        if (properties != null)
        {
            for (Entry<String, Object> entry : properties.entrySet())
            {
                String propertyName = entry.getKey();
                Object propertyValue = entry.getValue();

                setValue(propertyName, propertyValue);
            }
        }
    }

    private void setValue(String propertyName, Object propertyValue)
    {
        if (propertyValue != null)
        {
           Method method = getSetter(propertyName);
           Object value = convertToValue(propertyValue, method.getParameterTypes()[0]);
           method.invoke(innerBean, value);
        }
    }

    private Method getSetter(String propertyName)
    {
      // Assume a valid bean, add a "set" at the beginning and toUpper the 1st character.
      // Scan the list of methods for a method with the same name, assume it is a "valid setter" (i.e. single argument)
      ... 
    }

    private Object convertToValue(String valueAsString, Class type)
    {
        // Check the type for all supported types and convert accordingly
        if (type.equals(Integer.TYPE))
        {
          ...
        }
        else if (type.equals(Integer.TYPE))
        {
          ...
        }
        ...
    }
}

Die eigentliche "Schwierigkeit" besteht in der Implementierung von convertToValue für alle möglichen Wertetypen . Ich habe dies mehr als einmal in meinem Leben getan einige enums) - aber ich hoffte, dass es eine intelligentere Lösung gab.

20
RonK

Sie können SpEL und Platzhalter und Standardwert für Platzhalter-Mechanismen zusammen wie folgt verwenden:

<bean name="myBean" class="some.Type">
    <property name="abc" value="${some.param:#{null}}"/>
</bean>
30
Sam

Um Ihr Problem zu lösen, müssen Sie SEL (Spring Expression Language) verwenden. Durch diese Funktion (hinzugefügt in SPring 3.0) können Sie zum Beispiel andere dynamische Sprachen für Ihre Bedingung verwenden. Für Ihren Kontext lautet die Antwort:

<bean name="myBean" class="some.Type">
   <property name="abc" value="#(if(${some.param} != null) ${some.param})"/>
</bean>

weitere Informationen finden Sie in diesem Tutorial (hier wird angegeben, was SEL in Kontextdateien verwendet): http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html

5
Sam

Sie können das Standardwertkonzept im Eigenschaften-Konfigurator in Spring Framework wie folgt verwenden:

<bean name="myBean" class="some.Type">
   <property name="abc" value="${some.param : your-default-value}"/>
</bean>

sie können den Standardwert auf diese Weise festlegen. In diesem Kontext ist config, wenn some.param key vorhanden ist, so dass sein Wert in abc -Eigenschaft und falls nicht vorhanden your-default-value in abc -Eigenschaft festgelegt ist.

Hinweis: Ein weiterer Vorteil dieses Ansatzes ist: "Im POJO-Programmiermodell ist besser geeignet, dass ein Member der Klasse keinen Standardwert hat und der Standardwert von außerhalb der Klasse eingefügt wurde."

3
Sam

Sie können eine Utility-Klasse erstellen, die als Factory-Klasse für some.Type fungiert, und die Logik dort umschließen

Zum Beispiel : 

public class TypeFactory {
    public static Type craeteType(SomeType param){
        Type t = new Type();
        if(param!=null)
            t.setParam(param);
    }
}

und bei XML konfigurieren Sie die Bean-Erstellung mit dieser Factory-Methode

<bean id="myBean" class="some.Type"
      factory-method="craeteType">
    <constructor-arg ref="param"/>  
</bean>
1
Jigar Joshi

Ich habe es mit folgendem Ausschnitt gemacht:

<bean name="myBean" class="some.Type">
    <property name="abc" value="#{'${some.param}'=='' ? null : '${some.param}'}" />
</bean>
0
volkovs

Dies sieht aus wie ein Job für Java-basierte Container-Konfiguration . Sie können in Ihrer XML-Konfiguration alles tun, was Sie jedoch mit der ganzen Leistungsfähigkeit von Java tun.

0
JB Nizet