0

enter code hereI try to acess a java class by his interface I make a class in Ls2J instead the java interface because i don't know how i do and i have the error :

error : LS2J Error: Java constructor failed to execute

An idea ? ^^

thanks !

my class java in lotus

Class ILogWebService
sessionJava As JAVASESSION      
classJava As JAVACLASS
objectJava As JAVAOBJECT        
methodJava As JAVAMETHOD

Public Sub New(logDTO As LogWSDTO)
    Set sessionJava = New JAVASESSION
    Set classJava = sessionJava.GetClass("com.pasquier.DAO.WS/ILogWebService")
    Set objectJava = classJava.CreateObject     
End Sub

Public Sub notesMain()
    Set methodJava = classJava.GetMethod("notesMain","()V")     
    objectJava.notesMain        
End Sub 

End Class

my java interface:

package com.pasquier.IDAO.WS;

import com.pasquier.MesExceptions.ExceptionWS;

public interface ILogWebService {

void notesMain() throws ExceptionWS;    

}

my java class :

public class LogWebService implements ILogWebService {
private Session session;
private LogWSDTO logDTO = null;

public LogWebService(LogWSDTO log) {
    this.logDTO = log;
}


public void notesMain() throws ExceptionWS  {
    try 
    {
        try 
        {           
            session =  WebServiceBase.getCurrentSession();              
                        ILogWSDAO ilog = FactoryWS.getInstance().createLogWSDAO(session, logDTO);

            ilog.ajouterLog();  
        } finally
        {
            UtilMemoire.purgeMemoire(); 
        }
    } catch (NullPointerException e1)
    {   
        System.out.println("ERREUR NullPointer sur NotesMain sur LogWebService");
        throw new ExceptionWS("ERREUR NullPointer sur NotesMain sur LogWebService", e1, logDTO);
    } catch (ExceptionWS e) 
    {
        System.out.println( e.getMessage());        
    } catch (Exception e2) 
    {           
        System.out.println("ERREUR sur NotesMain sur LogWebService " + e2.getMessage());    
        throw new ExceptionWS("ERREUR sur NotesMain sur LogWebService " + e2.getMessage(), e2, logDTO);
    }
}

my lotuscript :

Class LogGetAllDocumentsDAO

Private ilog As ILogWebService 
Private logDTO As LogWSDTO
Private docDTO As LogGetAllDocumentsDTO
Private utilDt As UtilDate

Public Sub New(logWSparam As LogWSDTO, docDTOparam As LogGetAllDocumentsDTO)
    Set Me.logDTO = logWSparam
    Set Me.docDTO = docDTOparam

End Sub 

Public Sub appelLog()       
    Call ajouterParam()         
    Set ilog = New ILogWebService(logDTO)       
    'Call ilog.notesMain()
End Sub 

Public Sub ajouterParam()

    Dim retourWS As String 
    Dim paramWS As String

    'paramètres d'envoi de web services
    paramWS = "dbserver=" + docDTO.getDbServer
    paramWS = paramWS + "dbpath="  + docDTO.getDbPath
    paramWS = paramWS + "nomVue="  + docDTO.getNomVue
    paramWS = paramWS + "key="  + docDTO.getKey
    paramWS = paramWS + "sep="  + docDTO.getSep

    logDTO.setParamWS(paramWS)

    'paramètres de retour de web services
    retourWS = "Nombre d'Identifiants : ...." 
    logDTO.setRetourWS(retourWS)

    'logDTO.setDateHeureDebutWS(utilDt.dateTimeDuJour(session, logDTO))     

End Sub     

End Class

thanks for your help !!

i come back because it didn't work i try this to call my class as if the interface doesn't exist but it says error : "LS2J Error : Java constructor failed to execute"

Sub Click(Source As Button)
Dim mySession As JAVASESSION    
Dim myClass As JAVACLASS
Dim myObjet As JAVAOBJECT
Dim toto As String
Dim toto2 As String
Dim myCollection As JavaMethodCollection
Dim myMethod As JavaMethod
Dim myMethod2 As JavaMethod
toto2 = "test"

Set mySession = New  JAVASESSION        
Set myClass = mySession.GetClass("com.pasquier.launcher/LogWebService") 
Set myObjet = myClass.CreateObject("(Lcom/pasquier/DTO/WS/LogWSDTO;)V")


Messagebox (toto2)

Set myCollection = myClass.getClassMethods()

Set myMethod = myCollection.getFirst()
Do
    If myCollection.count <> 0 Then 
        toto2 =  myMethod.MethodName & " " & myMethod.signature
        Messagebox (toto2)          

    End If
    Set myMethod = myCollection.getNext()       
Loop While myCollection.current <> 1    

End Sub

could you help me ?

4

3 回答 3

2

让我们假设我们有一个包com.pasquier.IDAO.WS和其中的以下类/接口:

  • 日志网络服务
  • 日志WSDTO
  • ILogWeb服务

LS2J 是一个奇怪的东西,在某些情况下不能正常工作。当 LS2J 报告不应该发生的错误时,开发人员会做出这样的反应。

我们假设 LogWSDTO 有默认构造函数,所以我们创建它的实例:

Set logWSDTOClass = javaSession.getClass("com/pasquier/IDAO/WS/LogWSDTO")
Set logWSDTOObject = logWSDTOClass.CreateObject()

然后我们创建对象,在它的构造函数中使用这个日志。

我们得到了这个类:

Set logWebServiceClass = javaSession.getClass("com/pasquier/IDAO/WS/LogWebService")

并调用:

Set logWebServiceObject = logWebServiceClass.CreateObject("(Lcom/pasquier/IDAO/WS/LogWSDTO;)V", logWSDTOObject)

TA-DAA!,这是行不通的。我们得到一个著名的“Java 构造函数执行失败”。为什么?因为构造函数有一个类型正确的参数,因此不应发生此错误。但它是 LS2J,我们需要受苦 :)

因此,我们需要一种解决方法来解决此任务。

我们正在修改我们的LogWebService类以声明一个默认构造函数,并且我们正在添加一个新方法:

public void setLog(LogWSDTO log) {
   this.logDTO = log;       
}

之后我们这样做:

Set logWebServiceObject = logWebServiceClass.CreateObject()
Call logWebServiceObject.setLog(logWSDTOObject)
Call logWebServiceObject.notesMain()

有用。魔法。

下面列出了此示例所需的所有类/代码:


package com.pasquier.IDAO.WS;

public class LogWSDTO {

    public LogWSDTO() {
        System.out.println("@@@ LogWSDTO constructor called!");
    }

    public void log() {
        System.out.println("@@@ LogWSDTO DO called!");
    }

}

package com.pasquier.IDAO.WS;

public interface ILogWebService {
    void notesMain();
}

package com.pasquier.IDAO.WS;

import lotus.domino.Session;

public class LogWebService implements ILogWebService {

    private Session session;
    private LogWSDTO logDTO = null; 

    public LogWebService() {
        System.out.println("LogWebService: Default Constructor called!");
    }

    public void setLog(LogWSDTO log) {
        this.logDTO = log;      
    }

    public LogWebService(LogWSDTO log) {
        this.logDTO = log;
        System.out.println("~~~ LogWebService.constructor!!!");
    }

    public void notesMain() {
        // TODO Auto-generated method stub
        System.out.println("~~~ LogWebService.notesmain called!!!");
        this.logDTO.log();

    }
}

和lotusscript代码:

Sub Click(Source As Button)
    Dim javaSession As New JAVASESSION
    Dim javaError As JAVAERROR

    On Error Goto ErrorHandling

    Dim logWSDTOClass As JAVACLASS
    Dim logWSDTOObject As JavaObject

    Dim logWebServiceClass As JAVACLASS
    Dim logWebServiceObject As JavaObject

    Set logWSDTOClass = javaSession.getClass("com/pasquier/IDAO/WS/LogWSDTO")
    Set logWSDTOObject = logWSDTOClass.CreateObject()

    Set logWebServiceClass = javaSession.getClass("com/pasquier/IDAO/WS/LogWebService")

    'Does not work, but should 
    'Set logWebServiceObject = logWebServiceClass.CreateObject("(Lcom/pasquier/IDAO/WS/LogWSDTO;)V", logWSDTOObject)

    'workaround
    Set logWebServiceObject = logWebServiceClass.CreateObject()
    Call logWebServiceObject.setLog(logWSDTOObject)
    Call logWebServiceObject.notesMain()

    Msgbox "done"

    Exit Sub
ErrorHandling:
    Msgbox Error '
    Set javaError = javaSession.getLastJavaError
    Msgbox "Java error: " + javaError.ErrorMsg 
End Sub

要查看输出消息(通过 System.out.println),请通过菜单“工具 - 显示 Java 调试控制台”打开 Java 调试控制台。有时此控制台不显示,您需要重新启动 Lotus 客户端和设计器。

于 2014-06-25T09:06:53.197 回答
0

我没有经常使用 LS2J,但在我看来,您的 Java 类的构造函数将 LogWSDTO 对象作为参数,但您在调用classJava.CreateObject时没有任何参数。我相信你应该传递一个 JNI 签名字符串和参数,如 doc here中所示。

于 2014-06-24T14:22:45.543 回答
0

嗯;Domino 9.0.1FP3 在这方面存在一个已知问题;这可能是根本问题吗?您使用的是那个版本的 Domino 或 Notes?请参阅 IBM 技术说明http://www-01.ibm.com/support/docview.wss?uid=swg21696682

于 2015-08-05T09:47:01.450 回答