복붙노트

[SPRING] Spring - 값이 null이 아닌 경우에만 속성을 설정합니다.

SPRING

Spring - 값이 null이 아닌 경우에만 속성을 설정합니다.

Spring을 사용할 때 전달 된 값이 null이 아닌 경우에만 속성을 설정할 수 있습니까?

예:

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

내가 찾고있는 행동은 :

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

그 이유는 abc가 널 값으로 겹쳐 쓰고 싶지 않은 디폴트 값을 가지고 있기 때문입니다. 그리고 내가 만들고있는 콩은 소스 컨트롤 아래에 있지 않습니다. 그래서 나는 그 행동을 바꿀 수 없습니다. (또한이 목적을위한 abc는 프리미티브 일 수 있으므로 어쨌든 null로 설정할 수 없습니다.

편집하다: 대답에 따르면 내 질문에는 설명이 필요하다고 생각합니다.

인스턴스화하고 제 3 자에게 전달해야하는 bean이 있습니다. 이 bean은 다양한 유형 (int, boolean, String 등)의 많은 특성 (현재 12 개) 각 속성에는 기본값이 있습니다. 그 속성이 무엇인지 알지 못하고 문제가되지 않는 한 알 필요가없는 것이 좋습니다. 내가 찾고있는 것은 Spring의 능력에서 오는 일반적인 해결책이다 - 현재 유일한 해결책은 반영 기반이다.

구성

<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>

암호

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))
        {
          ...
        }
        ...
    }
}

실제 "어려움"은 가능한 모든 값 유형에 대해 convertToValue를 구현하는 것입니다. 나는 이것을 한 번 이상 내 삶에서 해냈다. 그래서 내가 필요한 모든 유형 (주로 기본 요소와 소수의 enum)에 대해 구현하는 것이 주요한 문제는 아니지만보다 지능적인 솔루션이 존재하기를 바랐다.

해결법

  1. ==============================

    1.다음과 같이 자리 표시 자 메커니즘에 대한 SpEL 및 자리 표시 자 및 기본값을 함께 사용할 수 있습니다.

    다음과 같이 자리 표시 자 메커니즘에 대한 SpEL 및 자리 표시 자 및 기본값을 함께 사용할 수 있습니다.

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

    2.문제를 해결하려면 SEL (Spring Expression Language)을 사용해야합니다. 이 기능 (SPring 3.0에 추가됨)을 사용하면 다른 동적 언어로 상태를 작성할 수 있습니다. 귀하의 맥락에서 대답은 :

    문제를 해결하려면 SEL (Spring Expression Language)을 사용해야합니다. 이 기능 (SPring 3.0에 추가됨)을 사용하면 다른 동적 언어로 상태를 작성할 수 있습니다. 귀하의 맥락에서 대답은 :

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

    자세한 내용은 (이 자습서에서는 컨텍스트 파일에서 SEL을 사용하는 방법을 설명합니다.) http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/expressions.html

  3. ==============================

    3.다음과 같이 스프링 프레임 워크의 프로퍼티 구성 자에서 디폴트 값 개념을 사용할 수 있습니다 :

    다음과 같이 스프링 프레임 워크의 프로퍼티 구성 자에서 디폴트 값 개념을 사용할 수 있습니다 :

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

    이 방법으로 기본값을 설정할 수 있습니다. 이 컨텍스트 config에 의해 some.param 키가 존재하므로 abc 속성에 값이 설정되고 존재하지 않으면 abc 속성에 your-default-value가 설정됩니다.

    참고 :이 접근법의 또 다른 이점은 다음과 같습니다. "POJO 프로그래밍 모델에서 더 나은 접근 방법은 클래스의 멤버가 기본값을 가지지 않고 클래스 밖에서 주입 된 기본값입니다."

  4. ==============================

    4.some.Type의 Factory 클래스로 작동하고 거기에 로직을 랩핑하는 Utility 클래스를 생성 할 수 있습니다

    some.Type의 Factory 클래스로 작동하고 거기에 로직을 랩핑하는 Utility 클래스를 생성 할 수 있습니다

    예 :

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

    XML에서이 Factory 메소드를 사용하여 Bean 생성을 구성합니다.

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

    5.이것은 Java 기반 컨테이너 구성 작업과 같습니다. XML 설정에서 할 수있는 일은 모든 자바의 힘으로 할 수 있습니다.

    이것은 Java 기반 컨테이너 구성 작업과 같습니다. XML 설정에서 할 수있는 일은 모든 자바의 힘으로 할 수 있습니다.

  6. ==============================

    6.나는 다음과 같이 작업하고있다.

    나는 다음과 같이 작업하고있다.

    <bean name="myBean" class="some.Type">
        <property name="abc" value="#{'${some.param}'=='' ? null : '${some.param}'}" />
    </bean>
    
  7. from https://stackoverflow.com/questions/9347929/spring-set-a-property-only-if-the-value-is-not-null by cc-by-sa and MIT license