2011-10-19 11 views
2

私はSpring 3.0.5を使用してJavaアプリケーションを開発し、mybatis-springを使用してデータベースOracleで作業します。mybatisによって実行されるoracleプロシージャからパラメータを受け取ることができません

IはMyBatisのためのインタフェースでいる:canCustomerSubscribeため

public interface SubscriberMapper { 
    Subscriber getSubscriberByMsisdn(String msisdn); 

    void insertSubscriber(Subscriber subscriber); 

    void updateSubscriber(Subscriber subscriber); 

    void canCustomerSubscribe(@Param("msisdn") String msisdn, 
         @Param("responseCode") Integer responseCode); 

}

MyBatisのXMLコンテンツを:

<parameterMap id="canCustomerSubscribeParams" type="map"> 
    <parameter property="msisdn" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/> 
    <parameter property="responseCode" jdbcType="NUMERIC" javaType="java.lang.Integer" mode="OUT"/> 
</parameterMap> 
<select id="canCustomerSubscribe" parameterMap="canCustomerSubscribeParams" statementType="CALLABLE"> 
    CALL wallet.pkg_wallet_validation.can_customer_subscribe(#{msisdn}, #{responseCode}) 
</select> 

および実行するコード:

public void subscribe(String msisdn) throws InvalidArgumentException { 
    Integer responseCode = 0; 
    subscriberMapper.canCustomerSubscribe(msisdn, responseCode); 
    System.out.println("msisdn: " + msisdn + ", responseCode: " + responseCode); 
} 

私 無効な "msisdn"メソッドで "subscribe"メソッドを実行すると、プロシージャから実際の値が返されません。データベースにこの手順の実行は= 1001 reponseValueを返しますが、Javaコードで私はMyBatisの出力のためにどっしりしてデバッグログをオンに0をされて受信します。

2011-10-19 10:32:46,732 DEBUG [main] (Slf4jImpl.java:28) ooo Connection Opened 
2011-10-19 10:32:46,909 DEBUG [main] (Slf4jImpl.java:28) ==> Executing: CALL wallet.pkg_wallet_validation.can_customer_subscribe(?, ?) 
2011-10-19 10:32:46,911 DEBUG [main] (Slf4jImpl.java:28) ==> Parameters: 509999999(String), 0(Integer) 
msisdn: 509999999, responseCode: 0 

私は「購読する」方法はResponseCodeに変更= null、受信とエラー:

org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: java.sql.SQLException: Invalid column type 
; uncategorized SQLException for SQL []; SQL state [null]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type 

答えて

6

解決策が見つかりました。 canCustomerSubscribeメソッドでは、マップは2つのパラメータではなくユーザーでなければなりません。

void canCustomerSubscribe(Map<String,Object> params); 

MyBatisのXMLコンテンツ:

<select id="canCustomerSubscribe" parameterType="java.util.HashMap" statementType="CALLABLE"> 
    CALL wallet.pkg_wallet_validation.can_customer_subscribe(
    #{msisdn, jdbcType=VARCHAR, javaType=java.lang.String, mode=IN}, 
    #{responseCode,jdbcType=NUMERIC, javaType=java.lang.Integer, mode=OUT}) 
</select> 

(私は、引数の属性間のカンマを追加する必要があります)

サービスメソッド購読からそれを呼び出す:

public void subscribe(String msisdn) throws InvalidArgumentException { 
    Map<String, Object> params = new HashMap<String, Object>(); 
    params.put("msisdn", msisdn); 
    params.put("responseCode", null); 
    subscriberMapper.canCustomerSubscribe(params); 
    System.out.println(params.get("responseCode")); 
} 
+0

を私は、構文を修正XMLファイルの引数の間にカンマを追加する必要があります。 – Panciz

関連する問題