2015-01-21 3 views
2

payload.second가 null 인 경우에도이 코드가 작동하도록하려면 어떻게해야합니까 (선택적 매개 변수).저장 프로 시저 아웃 바운드 게이트웨이 null 매개 변수 처리

<int-jdbc:stored-proc-outbound-gateway id="outGtw" 
             data-source="someDs" 
             request-channel="someChannel" 
             reply-channel="someOtherChannel" 
             stored-procedure-name="someStoredProcedure" 
             ignore-column-meta-data="true"> 
    <int-jdbc:sql-parameter-definition name="first"/> 
    <int-jdbc:sql-parameter-definition name="second"/> 
    <int-jdbc:sql-parameter-definition name="outParam" direction="OUT" type="NVARCHAR"/> 
    <int-jdbc:parameter name="first" expression="payload.first"/> 
    <int-jdbc:parameter name="second" expression="payload.second"/> 
</int-jdbc:stored-proc-outbound-gateway> 

null 때 오류가 -

Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Required input parameter 'second' is missing 
    at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:211) ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1115) ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173) ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:381) ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:342) ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:190) ~[spring-jdbc-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.integration.jdbc.StoredProcExecutor.executeStoredProcedureInternal(StoredProcExecutor.java:328) ~[spring-integration-jdbc-4.0.4.RELEASE.jar:na] 
    at org.springframework.integration.jdbc.StoredProcExecutor.executeStoredProcedure(StoredProcExecutor.java:297) ~[spring-integration-jdbc-4.0.4.RELEASE.jar:na] 
    at org.springframework.integration.jdbc.StoredProcOutboundGateway.handleRequestMessage(StoredProcOutboundGateway.java:60) ~[spring-integration-jdbc-4.0.4.RELEASE.jar:na] 
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler$AdvisedRequestHandler.handleRequestMessage(AbstractReplyProducingMessageHandler.java:313) ~[spring-integration-core-4.0.4.RELEASE.jar:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_31] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_31] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_31] 
    at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_31] 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) ~[spring-aop-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.0.7.RELEASE.jar:4.0.7.RELEASE] 
    at org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice$1.cloneAndExecute(AbstractRequestHandlerAdvice.java:92) ~[spring-integration-core-4.0.4.RELEASE.jar:na] 
    at org.springframework.integration.handler.advice.RequestHandlerRetryAdvice$2.doWithRetry(RequestHandlerRetryAdvice.java:88) ~[spring-integration-core-4.0.4.RELEASE.jar:na] 
    at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:263) ~[spring-retry-1.1.1.RELEASE.jar:na] 
    at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:193) ~[spring-retry-1.1.1.RELEASE.jar:na] 
    at org.springframework.integration.handler.advice.RequestHandlerRetryAdvice.doInvoke(RequestHandlerRetryAdvice.java:85) ~[spring-integration-core-4.0.4.RELEASE.jar:na] 
    ... 88 common frames omitted 
+0

더보기 StackTrace, please. 원인의 근원을 이해해야합니다. 감사합니다 –

답변

1

이 스택 트레이스 주셔서 감사합니다. 당신이 매개 변수를 가질 수 없을 때 나는 단지 한 곳에서 볼이에 찾고 - ExpressionEvaluatingSqlParameterSourceFactory을 :

public boolean hasValue(String paramName) { 
     try { 
      Object value = doGetValue(paramName, true); 
      if (value == ERROR) { 
       return false; 
      } 
     } 
     catch (ExpressionException e) { 
      if (logger.isDebugEnabled()) { 
       logger.debug("Could not evaluate expression", e); 
      } 
      if (this.cache) { 
       values.put(paramName, ERROR); 
      } 
      return false; 
     } 
     return true; 
    } 

CallMetaDataContext#matchInParameterValuesWithCallParametershasValue() 반환 false 때문에 second 매개 변수를 채울 수 없습니다. 그리고 이것은 ExpressionException의 경우에만 발생합니다.

org.springframework.integration.jdbc 카테고리에 대해 DEBUG 로깅을 켜면 이유가 있습니다.

여기에 표시된 것은 단지이 간단한 질문 (payload.second) 표현이이 SO 질문을 복잡하게하지 않는다는 것입니다.

+0

감사 Artem, 나는 ExpressionEvaluatingSqlParameterSourceFactory를 사용하고 있지 않았지만, 다른 변경 작업을 수행 할 때 어떤 이유로 오류가 사라진 것 같았습니다. – Mark1234

관련 문제