[SPRING] Spring - 값이 null이 아닌 경우에만 속성을 설정합니다.
SPRINGSpring - 값이 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.다음과 같이 자리 표시 자 메커니즘에 대한 SpEL 및 자리 표시 자 및 기본값을 함께 사용할 수 있습니다.
다음과 같이 자리 표시 자 메커니즘에 대한 SpEL 및 자리 표시 자 및 기본값을 함께 사용할 수 있습니다.
<bean name="myBean" class="some.Type"> <property name="abc" value="${some.param:#{null}}"/> </bean>
-
==============================
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.다음과 같이 스프링 프레임 워크의 프로퍼티 구성 자에서 디폴트 값 개념을 사용할 수 있습니다 :
다음과 같이 스프링 프레임 워크의 프로퍼티 구성 자에서 디폴트 값 개념을 사용할 수 있습니다 :
<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.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.이것은 Java 기반 컨테이너 구성 작업과 같습니다. XML 설정에서 할 수있는 일은 모든 자바의 힘으로 할 수 있습니다.
이것은 Java 기반 컨테이너 구성 작업과 같습니다. XML 설정에서 할 수있는 일은 모든 자바의 힘으로 할 수 있습니다.
-
==============================
6.나는 다음과 같이 작업하고있다.
나는 다음과 같이 작업하고있다.
<bean name="myBean" class="some.Type"> <property name="abc" value="#{'${some.param}'=='' ? null : '${some.param}'}" /> </bean>
from https://stackoverflow.com/questions/9347929/spring-set-a-property-only-if-the-value-is-not-null by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Optimistic Locking : 커밋이 성공할 때까지 트랜잭션 방식을 다시 시도하는 방법 (0) | 2019.02.01 |
---|---|
[SPRING] 어떤 Tomcat 네이티브 라이브러리를 프로덕션 환경에서 사용해야합니까? (0) | 2019.02.01 |
[SPRING] try catch 블록을 사용할 때 Spring @ Transactional 주석 (0) | 2019.02.01 |
[SPRING] JUnit 테스트는 항상 트랜잭션을 롤백합니다. (0) | 2019.02.01 |
[SPRING] @Autowired Map을 만들 수 있습니까? (0) | 2019.02.01 |