2013-05-17 36 views
5

Tôi đã nhìn thấy một số câu hỏi về vấn đề này nhưng không có câu trả lời kết luận. Tôi gặp sự cố khi gọi một lớp Java từ triển khai bộ điều hợp Worklight của mình. Tôi đã thay thế mã của mình bằng mã từ hướng dẫn Bộ điều hợp Java Worklight Java và nó không thành công theo cùng một cách. Hơn nữa tôi tìm thấy một phản ứng trên trang web của IBM nói rằng trình biên dịch Java 1.7 có thể gây ra vấn đề này và sử dụng Java 1.6 thay thế. Tôi đã xác nhận rằng trình biên dịch của tôi trong Eclipse là Java 1.6.ECMA TypeError gọi Java class từ Worklight adapter

Screenshot of Eclipse and code path

lớp My Java tất cả bắt đầu với com (ví dụ com.worklight.customcode). Tôi đã thử cả hai gọi phương thức tĩnh công cộng (sử dụng cú pháp thích hợp) cũng như instantiating đối tượng và gọi phương thức. Như đã đề cập ở trên, tôi cũng đã xác nhận rằng tôi đang sử dụng trình biên dịch Java 1.6.

Dưới đây là một số mẫu mã:

Adaptor thực hiện file:

function addTwoIntegers(a,b){ 
    return { 
     result: com.worklight.customcode.Calculator1.addTwoIntegers(a,b) 
    }; 
} 

tập tin Java (chưa được chỉnh sửa mẫu IBM Worklight): gói com.worklight.customcode;

import java.util.logging.Logger; 

public class Calculator1 { 

    private final static Logger logger = Logger.getLogger(Calculator1.class.getName()); 

    public static int addTwoIntegers(int first, int second){ 
     logger.info("addTwoIntegers invoked"); 
     return first + second; 
    } 

    public int subtractTwoIntegers(int first, int second){ 
     logger.info("subtractTwoIntegers invoked"); 
     return first - second; 
    } 

} 

Lỗi trong giao diện điều khiển:

TypeError: Cannot call property addTwoIntegers in object [JavaPackage com.worklight.customcode.Calculator1]. It is not a function, it is "object". (%2FUsers%2Fhome%2Fdev%2Fapp%2Fappprj%2Fadapters%2Fadapter/adapter-impl.js#26) FWLSE0101E: Caused by: null

Một số câu hỏi có liên quan bao gồm:

Trả lời

2

Tôi đã đóng, nó không phải là CLASSPATH per se, mà là (rõ ràng) cài đặt dự án Eclipse.

Sau một tuần hoặc nhiều lần theo dõi tính năng này, tôi đã chỉnh sửa tệp .project để bao gồm các thẻ buildCommand nhất định mà dự án của tôi không có. Việc thêm các buildCommands sau vào phần này cho phép mã của tôi khởi chạy các lớp Java từ JavaScript sau khi khởi động lại Eclipse.

<buildSpec> 
    <buildCommand> 
     <name>org.eclipse.jdt.core.javabuilder</name> 
     <arguments> 
     </arguments> 
    </buildCommand> 
    <buildCommand> 
     <name>org.eclipse.wst.jsdt.core.javascriptValidator</name> 
     <arguments> 
     </arguments> 
    </buildCommand> 
    <buildCommand> 
     <name>org.eclipse.wst.common.project.facet.core.builder</name> 
     <arguments> 
     </arguments> 
    </buildCommand> 
    <buildCommand> 
     <name>com.worklight.studio.plugin.WorklightProjectBuilder</name> 
     <arguments> 
     </arguments> 
    </buildCommand> 
    <buildCommand> 
     <name>org.eclipse.wst.validation.validationbuilder</name> 
     <arguments> 
     </arguments> 
    </buildCommand> 
</buildSpec> 

Tệp .project nằm trong thư mục gốc của nhà dự án Worklight (ví dụ: myproject/.project). Tôi đã tìm ra điều này cuối cùng, bằng cách chạy qua một dự án làm việc đã thực hiện thành công Java từ JavaScript.

Xem http://www.ibm.com/developerworks/rational/library/server-side-mobile-application-development-1/

tôi sao chép mã đúng nguyên văn để dự án của tôi và nó đã có hành vi tương tự như mã của tôi. Tôi đã sao chép mã của mình vào dự án đó và mã của tôi đã hoạt động (!!). Sau đó tôi so sánh các classpaths, đó là hơi khác nhau, nhưng nó đã không thay đổi hành vi. Tôi đã kiểm tra tệp .project và nhận thấy tệp của tôi không có thẻ buildCommand ở trên.Thay vào đó, tệp của tôi có một số thẻ externalToolBuilding, có lẽ vì một trong những kẻ trong nhóm của tôi sử dụng một IDE khác với Eclipse và dự án của anh ta đã trở thành một trong dự án. (Tôi nghĩ đó là tuyệt vời, nếu nó quan trọng).

Tôi hoàn toàn không hiểu tất cả chi tiết về những gì các thẻ này làm hoặc chính xác cách thức và lý do tại sao Worklight và Eclipse thay đổi hành vi của chúng vì nó (hoặc tại sao chúng biến mất ngay từ đầu). Tuy nhiên, nó làm cho mã của tôi hoạt động. Nó chỉ làm tôi mất giá một tuần (ack!).

Tôi hy vọng điều này sẽ giúp người khác trong tương lai.

0

Trước tiên, hãy thử đảm bảo rằng đó không phải là vấn đề về chuyển đổi Loại. Trong mã Java của bạn, hãy xác định hàm Thêm với hai tham số đối tượng:

public static int addTwoIntegers(Object first, Object second) { 
    logger.info("addTwoIntegers invoked" + first.getClass() + "," + second.getClass()); 
    return first + second; 
} 

Nhìn vào đầu ra của máy chủ. Nếu đó là một vấn đề Loại, phương pháp bây giờ sẽ hoạt động. Nếu không, chúng tôi có một vấn đề khác ...

+0

Cảm ơn Idan. Tôi đã xác minh việc thay đổi kiểu từ int thành Object không có sự khác biệt. Tôi nhận được lỗi tương tự. – user2217751

+0

Tôi mạnh mẽ nghi ngờ đây là một vấn đề classpath với Eclipse/Worklight. Một chi tiết thú vị khác là mã mà một trong những nhà phát triển của tôi đã làm việc (đã lỗi thời trong dự án của chúng tôi bây giờ) đã làm việc tốt trên máy tính của anh ta nhưng không bao giờ làm trên máy của tôi. Tôi chỉ nhận ra đó là một vấn đề tương tự. Tôi không thể nhận được bất kỳ lớp Java nào hoạt động đúng từ JavaScript. Trong việc cọ rửa Internet liên quan đến vấn đề này, nó trông rất giống với một classpath (hoặc vấn đề cấu hình tương tự), nó hoạt động trên máy của một người nhưng không hoạt động trên máy của người khác. Bất kỳ lời khuyên về nơi để kiểm tra cấu hình trong WL? Tôi rõ ràng đã kiểm tra classpath. – user2217751

+0

Đây là liên kết đến một câu hỏi khác có vẻ liên quan (và chưa được giải quyết): http://stackoverflow.com/questions/15826456/ecma-error-typeerror-cannot-call-property?rq=1 – user2217751

2

chúng tôi đã gặp sự cố đó nhiều lần và nó luôn có liên quan đến tệp nhật thực bị hỏng. Điều gì xảy ra là lớp Java bạn không có được xây dựng và không được thêm vào tệp worklight.war của bạn. Khi bạn triển khai ứng dụng của mình, lớp được biên dịch bị thiếu trên máy chủ và lỗi ECMA cho bạn biết rằng theo cách rất khó hiểu.

Một giải pháp mà chúng tôi tìm thấy là mở các thuộc tính của dự án WL bằng cách nhấp chuột phải vào Đường dẫn xây dựng Java và di chuyển một số mục UP và DOWN bằng các nút ở đó. Sau khi đóng hộp thoại thuộc tính eclipse nên viết lại file .project và build sẽ hoạt động.

Một điều chúng tôi đã làm đôi khi là để thêm một lớp mới cho phần dự án/máy chủ/java của dự án sử dụng eclipse thuật sĩ New-Class, sạch sẽ và xây dựng lại dự án và sau đó loại bỏ lớp một lần nữa. Thậm chí có thể bắt đầu nhật thực với tùy chọn -clean ở cuối chuỗi khởi động mà nó sử dụng.

+0

Cảm ơn, vì tôi đã tạo một lớp Java tạm thời đã giải quyết vấn đề. –

0

Tôi không thể lấy ví dụ này làm việc vì lỗi này, mặc dù đã thử tất cả những điều nêu trên. Tôi đang sử dụng Eclipse 4.4, Worklight 6.2, Máy chủ ứng dụng WebSphere 8.5.5.1, Java 1.7. Tôi đã chạy bộ điều hợp bằng cách kích chuột phải vào nó và chọn Run As> Invoke Worklight Procedure.

Cuối cùng, tôi nhận được nó hoạt động bằng cách thêm rõ ràng Adapters.war đã tạo vào đường dẫn xây dựng dự án. Từ các thuộc tính đường dẫn xây dựng: Thêm các JAR ...> Bộ điều hợp/bin/Adapters.war. Chỉ sau đó nó mới bắt đầu hoạt động.

0

Sự cố này thường xảy ra với tôi ngay cả khi tôi mở dự án mới trên không gian làm việc mới. Tôi tin rằng các giải pháp được đề xuất ở đây không bao gồm tất cả các trường hợp, do đó, vì tính hữu dụng của tất cả, tôi liệt kê tất cả các giải pháp có thể tôi đã giải quyết được vấn đề:

1) kiểm tra phiên bản Java của máy chủ đang chạy giống như dự án, như đã đề cập here. Cá nhân tôi xóa tất cả các JRE đã cài đặt khác trong các thuộc tính không gian làm việc. Tôi thấy rằng trong một số trường hợp, họ nên chia sẻ cùng một phiên bản phụ, ví dụ nếu máy chủ chạy 1.7.0 bạn không nên có 1.7.49

2) kiểm tra mức tuân thủ trình biên dịch của không gian làm việc phù hợp với cùng một phiên bản java do máy chủ chạy, như đã đề cập here. Đây là nguyên nhân khiến tôi gặp nhiều khó khăn nhất vì nó là thứ tôi quên thường xuyên.

3) kiểm tra các tập tin .project: như đã đề cập here

4) Thông thường với 3 gợi ý này vấn đề của tôi đã mất hết, nhưng vì lợi ích của sự hoàn chỉnh Tôi cũng thêm this hint rằng có thể có một ý nghĩa

5) cuối cùng, bạn cũng có thể cần xóa ứng dụng "không đúng định dạng" trước đó khỏi máy chủ và xây dựng lại WAR