Difference in JavaGateway handling of byte[] between static and dynamic proxy objects?
Hi guys, I'm calling a java method as below:
public static byte[] SM4EncryptJson(byte[] arg0) throws Throwable {
String inJson = "";
try {
//logger.info("Payload :" + arg0);
inJson = new String(arg0);
//logger.info("As String :" + inJson);
EncTarget payload = JSON.parseObject(inJson, EncTarget.class);
return SM4Encrypt(payload.getContent().getBytes(),payload.getSecretKey());
}catch (Exception e){
logger.error("Error encrypting : ", e);
logger.error("Content : " + arg0);
logger.error("As String : " + new String(arg0));
//logger.log(Level.SEVERE, e.toString(),e);
return null;
}
}
Actually the behavior below is the same with a simple method just take a byte array as the augument.
I tried call this java method with static proxy object. That is, I imported the java class in iris then call it:
/
/Actually this import only need be called once unless the jar is updated
//The jar was loaded by gateway definition, not by this piece of codes
s sc = ##class(%Net.Remote.Service).OpenGateway("AnotherJava", .gatewayConfig)
s sc = ##class(%Net.Remote.Service).ConnectGateway(gatewayConfig, .gateway, , 1)
s sc = gateway.%Import("com.intersystems.demo.javademo.SM4WrapperWithJson")
w "--Running proxy java call-- ",!
#Dim arg As %Stream.GlobalBinary = ##Class(%Stream.GlobalBinary).%New()
s payload = ##Class(Demo.Entity.EncPayload).%New()
s payload.secretKey = "C2FEEEAC-CFCD-11D1-8B05-00600806D9B6"
d payload.content.CopyFrom(fileScr)
d payload.%JSONExportToStream(arg)
s rtnStream = ##class(com.intersystems.demo.javademo.SM4WrapperWithJson).SM4EncryptJson(gateway,arg)
w "The type of result is "_$classname(rtnStream),!
w !,"--Proxy java call finished successfully-- ",!
This works fine and I got what I expected:
DEMOSPACE>d ##Class(Test.JavaInvokingTest).TestStcProxyWithJson("c:\sec\source.txt","c:\sec\x.txt")
--Calling Java method with Static proxy class--
--Running proxy java call--
The type of result is %Library.GlobalBinaryStream
--Proxy java call finished successfully--
Then I also tried using dynamic proxy:
//Generate the proxy
//Actually this import only need be called once unless the jar is updated
//The jar was loaded by gateway definition, not by this piece of codes
s sc = ##class(%Net.Remote.Service).OpenGateway("AnotherJava", .gatewayConfig)
s sc = ##class(%Net.Remote.Service).ConnectGateway(gatewayConfig, .gateway, , 1)
w "--Generating Dynamic Proxy-- ",!
s proxy = ##class(%Net.Remote.Object).%New(gateway,"com.intersystems.demo.javademo.SM4WrapperWithJson")
w "--Running proxy java call-- ",!
#Dim arg As %Stream.GlobalBinary = ##Class(%Stream.GlobalBinary).%New()
s payload = ##Class(Demo.Entity.EncPayload).%New()
s payload.secretKey = "C2FEEEAC-CFCD-11D1-8B05-00600806D9B6"
d payload.content.CopyFrom(fileScr)
d payload.%JSONExportToStream(arg)
s rtnStream = proxy.SM4EncryptJson(arg)
w "The type of result is "_$classname(rtnStream),!
w !,"--Proxy java call finished successfully-- ",!
But it didn't work
DEMOSPACE>d ##Class(Test.JavaInvokingTest).TestDynProxyWithJson("c:\sec\source.txt","c:\sec\x.txt") --Calling Java method with Dynamic proxy class and JSON--
--Generating Dynamic Proxy--
--Running proxy java call--
Error calling proxy class
错误 #8104: Gateway Exception: <GATEWAY> java.lang.IllegalArgumentException sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) argument type mismatch1
I wonder why this happens and how to make a call with byte[] argument method using dynamic proxy?
Thanks.