如何从基于Java的webservice调用带有日期输入的Oracle过程?

如何从基于Java的webservice调用带有日期输入的Oracle过程?,java,oracle,web-services,plsql,Java,Oracle,Web Services,Plsql,现在我有一个带有IN和OUT参数的Oracle存储过程。IN参数是简单类型和集合(customType作为customObject的表)。OUT参数是一个REFCURSOR和一些varchar。问题是:当我在params中向Date发送一些数据格式的字符串时,它会向我抛出以下消息: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] at java

现在我有一个带有IN和OUT参数的Oracle存储过程。IN参数是简单类型和集合(customType作为customObject的表)。OUT参数是一个REFCURSOR和一些varchar。问题是:当我在params中向Date发送一些数据格式的字符串时,它会向我抛出以下消息:

java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
        at java.sql.Timestamp.valueOf(Timestamp.java:185)
        at oracle.sql.DATE.toBytes(DATE.java:720)
        at oracle.sql.DATE.<init>(DATE.java:222)
        at oracle.jdbc.oracore.OracleTypeDATE.toDatum(OracleTypeDATE.java:66)
        at oracle.sql.StructDescriptor.toOracleArray(StructDescriptor.java:717)
        at oracle.sql.StructDescriptor.toArray(StructDescriptor.java:1375)
        at oracle.sql.STRUCT.<init>(STRUCT.java:159)
        at oracle.sql.OracleSQLOutput.getSTRUCT(OracleSQLOutput.java:114)
        at oracle.sql.STRUCT.toSTRUCT(STRUCT.java:524)
        at oracle.jdbc.oracore.OracleTypeADT.toDatum(OracleTypeADT.java:227)
        at oracle.jdbc.oracore.OracleTypeADT.toDatumArray(OracleTypeADT.java:274)
        at oracle.jdbc.oracore.OracleTypeUPT.toDatumArray(OracleTypeUPT.java:115)
        at oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:1314)
        at oracle.sql.ARRAY.<init>(ARRAY.java:152)
        ...
我创建的用于支持webservice(通过Axis)的Java类基本上执行以下操作:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

import com.osmosyscol.commons.log.SimpleLogger;

public class WSStackOverflowRules {

    // ---------------------------------------------

    public CustomResponseClass liquidar(CustomRequestClass solicitudLiquidar) {

        CustomResponseClass respuesta = new CustomResponseClass();

        try {

            String procedimiento = "call PACKAGE1.complex_procedure(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

            Connection cn = null;

            try {
                DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

                cn = DriverManager.getConnection( "jdbc:oracle:thin:@<that_ip>:<that_port>:<that_SID>", "<that_user>", "<that_pwd>" );
                OracleCallableStatement callStatement = null;

                ConceptosAdicionales conceptosObject1 = new ConceptosAdicionales();
                conceptosObject1.setCod_tpOper("A1");
                conceptosObject1.setValorCpto(1000); 
                conceptosObject1.setFecpagoCpto("2009-12-29");//TESTING DIRECTLY!!!

                ConceptosAdicionales conceptosObject2 = new ConceptosAdicionales();
                conceptosObject2.setCod_tpOper("B2"); 
                conceptosObject2.setValorCpto(1500); 
                conceptosObject2.setFecpagoCpto("2010-02-27");//TESTING DIRECTLY!!!

                ConceptosAdicionales[] conceptosArray = {conceptosObject1,conceptosObject2};
                CuotasIrregulares[] irregularesArray = {};

                ArrayDescriptor conceptosArrayDesc = ArrayDescriptor.createDescriptor("customTypeObj1", cn);
                ARRAY conceptosArrayObject = new ARRAY(conceptosArrayDesc, cn, conceptosArray);

                ArrayDescriptor irregularesArrayDesc = ArrayDescriptor.createDescriptor("customTypeObj2", cn);
                ARRAY irregularesArrayObject = new ARRAY(irregularesArrayDesc, cn, irregularesArray);


                callStatement = (OracleCallableStatement)cn.prepareCall(procedimiento);

                callStatement.setString(1, solicitudLiquidar.getCod_trans());

                callStatement.setString(2, solicitudLiquidar.getCanal());

                callStatement.setInt(3, solicitudLiquidar.getOficina());

...

                callStatement.setLong(10, solicitudLiquidar.getValor_total());

                callStatement.setLong(11, solicitudLiquidar.getValor_cuotainicial());

                callStatement.setString(12, "30/08/2010");  //TESTING DIRECTLY!!!

                callStatement.setLong(13, solicitudLiquidar.getValor_cuotainicial_fija());

                callStatement.setString(14, "26/02/2009");//TESTING DIRECTLY!!!

...

                ((OracleCallableStatement)callStatement).setArray(17, irregularesArrayObject);
                ((OracleCallableStatement)callStatement).setArray(18, conceptosArrayObject);

                callStatement.registerOutParameter(19, OracleTypes.CURSOR);
                callStatement.registerOutParameter(20, Types.VARCHAR);
                callStatement.registerOutParameter(21, Types.VARCHAR);
                callStatement.registerOutParameter(22, Types.VARCHAR);
                callStatement.registerOutParameter(23, Types.VARCHAR);

                callStatement.executeUpdate();

                ResultSet rs = (ResultSet)callStatement.getObject(19);
                while(rs.next()) {
                    //stuff
                }

                respuesta.setP_Cod_Rspta( callStatement.getString(20) );
                respuesta.setP_Rspta( callStatement.getString(21) );
                respuesta.setP_fecRspta( callStatement.getString(22) );
                respuesta.setP_hora_Rspta( callStatement.getString(23) );

                System.out.println("todo bien, todo bien");
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            } finally {
                cn.close();
            }

        } catch (Exception e) {
            System.out.println("Error calling web service (WSStackOverflowRules.liquidar)", e);
        }

        return respuesta;
    }
}
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.Types;
导入oracle.jdbc.OracleCallableStatement;
导入oracle.jdbc.driver.OracleTypes;
导入oracle.sql.ARRAY;
导入oracle.sql.ArrayDescriptor;
导入com.osmosyscol.commons.log.SimpleLogger;
公共类WSStackOverflowRules{
// ---------------------------------------------
公共CustomResponseClass liquidar(CustomRequestClass征求liquidar){
CustomResponseClass respuesta=新建CustomResponseClass();
试一试{
String procedimiento=“调用程序包1.复杂程序(?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?”;
连接cn=null;
试一试{
registerDriver(新的oracle.jdbc.driver.OracleDriver());
cn=DriverManager.getConnection(“jdbc:oracle:thin:@::”、“”、“”);
OracleCallableStatement callStatement=null;
Conceptosadicials conceptosObject1=新的Conceptosadicials();
概念对象1.设置操作(“A1”);
概念对象1.setValorCpto(1000);
conceptosObject1.setFecpagoCpto(“2009-12-29”);//直接测试!!!
Conceptosadicials conceptosObject2=新的Conceptosadicials();
概念对象2.设置密码操作(“B2”);
概念对象2.setValorCpto(1500);
概念对象2.setFecpagoCpto(“2010-02-27”);//直接测试!!!
Conceptosadivationals[]conceptosArray={conceptosObject1,conceptosObject2};
cuotasunregulares[]unregularesarray={};
ArrayDescriptor conceptosArrayDesc=ArrayDescriptor.createDescriptor(“customTypeObj1”,cn);
数组conceptosArrayObject=新数组(conceptosArrayDesc,cn,conceptosArray);
ArrayDescriptor unregularesarraydesc=ArrayDescriptor.createDescriptor(“customTypeObj2”,cn);
数组unregularesarayobject=新数组(unregularesaraydesc,cn,unregularesarray);
callStatement=(OracleCallableStatement)cn.prepareCall(procediemento);
callStatement.setString(1,requestudliquidar.getCod_trans());
callStatement.setString(2,requestudliquidar.getCanal());
callStatement.setInt(3,requestudliquidar.getOficina());
...
callStatement.setLong(10,requestudliquidar.getValor_total());
callStatement.setLong(11,requestudliquidar.getValor_cuotainicial());
callStatement.setString(12,“30/08/2010”);//直接测试!!!
callStatement.setLong(13,requestudliquidar.getValor_cuotainicial_fija());
callStatement.setString(14,“26/02/2009”);//直接测试!!!
...
((OracleCallableStatement)callStatement).setArray(17,unregularesArrayObject);
((OracleCallableStatement)callStatement).setArray(18,conceptosArrayObject);
registerOutParameter(19,OracleTypes.CURSOR);
registerOutParameter(20,Types.VARCHAR);
registerOutParameter(21,Types.VARCHAR);
registerOutParameter(22,Types.VARCHAR);
registerOutParameter(23,Types.VARCHAR);
callStatement.executeUpdate();
ResultSet rs=(ResultSet)callStatement.getObject(19);
while(rs.next()){
//东西
}
respuesta.setP_Cod_Rspta(callStatement.getString(20));
respuesta.setP_Rspta(callStatement.getString(21));
respuesta.setP_fecRspta(callStatement.getString(22));
respuesta.setP_hora_Rspta(callStatement.getString(23));
System.out.println(“todo bien,todo bien”);
}捕获(例外e){
System.out.println(e.getMessage());
e、 printStackTrace();
}最后{
cn.close();
}
}捕获(例外e){
System.out.println(“调用web服务时出错(WSStackOverflowRules.liquidar)”,e);
}
返回respuesta;
}
}
支持oracle对象、请求和响应的类也存在。 提前谢谢

编辑2009年12月28日:正如建议的那样,我在WS类中完成了以下操作:

(...)
cn = DriverManager.getConnection( <that_URL>, <that_user>, <that_pwd> );
OracleCallableStatement callStatement = null;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date setDate = new Date(0);
long dateTime = 0;
java.sql.Date sqlDate = new java.sql.Date(0);

ConceptosAdicionales conceptosObject1 = new ConceptosAdicionales();
conceptosObject1.setCod_tpOper("A1");
conceptosObject1.setValorCpto(1000); 
setDate = (Date) df.parse("29/12/2009");
dateTime = setDate.getTime(  );
sqlDate = new java.sql.Date( dateTime );
conceptosObject1.setFecpagoCpto(sqlDate);
(...)
(…)
cn=DriverManager.getConnection(,);
OracleCallableStatement callStatement=null;
DateFormat df=新的简化格式(“dd/MM/yyyy”);
日期设置日期=新日期(0);
长日期时间=0;
java.sql.Date sqlDate=new java.sql.Date(0);
Conceptosadicials conceptosObject1=新的Conceptosadicials();
概念对象1.设置操作(“A1”);
概念对象1.setValorCpto(1000);
setDate=(日期)df.parse(“29/12/2009”);
dateTime=setDate.getTime();
sqlDate=newjava.sql.Date(dateTime);
conceptosObject1.setFecpagoCpto(sqlDate);
(...)

这种设置日期的方法与任何其他日期参数一起复制。Conceptosadivationals类现在有一个java.sql.Date属性,而不是字符串。区分java.util.Date和sql日期很重要。我曾经按照这里显示的方式进行转换。希望这对这里的人有帮助。谢谢大家

让web服务将字符串绑定到一个日期,然后再传回。您希望这样做,因为它将验证正确的格式和类型。结合
(...)
cn = DriverManager.getConnection( <that_URL>, <that_user>, <that_pwd> );
OracleCallableStatement callStatement = null;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date setDate = new Date(0);
long dateTime = 0;
java.sql.Date sqlDate = new java.sql.Date(0);

ConceptosAdicionales conceptosObject1 = new ConceptosAdicionales();
conceptosObject1.setCod_tpOper("A1");
conceptosObject1.setValorCpto(1000); 
setDate = (Date) df.parse("29/12/2009");
dateTime = setDate.getTime(  );
sqlDate = new java.sql.Date( dateTime );
conceptosObject1.setFecpagoCpto(sqlDate);
(...)