8

Gọi getMetaData() trên một thành phần trong Coldfusion 10 dường như ngẫu nhiên ném NullPointerException bên trong. Mặc dù ngoại lệ này không được phơi bày cũng như không ảnh hưởng đến yêu cầu thực tế (và do đó không quan trọng đối với các ứng dụng của chúng tôi), nó vẫn lấp đầy nhanh chóng các tệp exception.log.getMetaData() ném nội bộ NullPointerException

Tôi nhận thấy điều này có thể liên quan đến bộ nhớ đệm đường dẫn của ColdFusion vì tôi nhận các mục nhập NullPointerException này trên máy chủ sản xuất. Tôi cũng nhận thấy rằng ngoại lệ này chỉ được ném một lần cho mỗi thành phần mà tôi sử dụng getMetaData() trên, mặc dù không phải mọi cuộc gọi đầu tiên dường như kích hoạt nó.

Để làm rõ: getMetaData() hoạt động hoàn toàn tốt, nhưng đôi khi nó ghi nhật ký NullPointerException trong tệp exception.log của ColdFusion.

Có ai biết giải pháp (ngoài việc tắt bộ nhớ đệm hoặc tệp exception.log) không?

Bối cảnh: Tôi sử dụng getMetaData() để xác định các thành phần, đặc biệt hữu ích khi sử dụng <cfinterface>.

java.lang.NullPointerException 
    at coldfusion.util.Utils.getServletPath(Utils.java:100) 
    at coldfusion.util.Utils.getServletPath(Utils.java:90) 
    at coldfusion.util.Utils.getBaseTemplatePath(Utils.java:419) 
    at coldfusion.runtime.TemplateProxyFactory.getTemplateFileHelper(TemplateProxyFactory.java:1567) 
    at coldfusion.runtime.MetadataUtils.getComponentMetadata(MetadataUtils.java:112) 
    at coldfusion.runtime.CfJspPage.GetComponentMetadata(CfJspPage.java:2744) 
    at coldfusion.runtime.TemplateProxy.getRuntimeComponentMetadata(TemplateProxy.java:1940) 
    at coldfusion.runtime.TemplateProxy.getRuntimeMetadata(TemplateProxy.java:1801) 
    at coldfusion.runtime.MetadataUtils.getMetaData(MetadataUtils.java:54) 
    at coldfusion.runtime.CfJspPage.GetMetadata(CfJspPage.java:2717) 
+0

Vì CF là nguồn đóng, sẽ rất khó để có được câu trả lời cho lý do tại sao điều đó xảy ra với bất kỳ ai khác ngoài nhóm kỹ thuật CF. Tôi sẽ gửi báo cáo lỗi tại đây: https://bugbase.adobe.com/. Trong thời gian đó, bạn có thể sử dụng IsInstanceOf() để xác định loại thành phần không? https://wikidocs.adobe.com/wiki/display/coldfusionen/IsInstanceOf –

+0

Thật không may isInstanceOf() yêu cầu đường dẫn đủ điều kiện. Vì tôi sử dụng ánh xạ động trên các môi trường máy chủ khác nhau, tôi không biết đường dẫn chính xác. Phản ánh thông qua getMetaData() dường như là cách tốt nhất để làm điều đó. Vâng, tôi không đoán được. – Alex

+1

Trừ khi bạn nhìn thấy một vấn đề hiệu suất cụ thể với các lỗi được ném tôi sẽ gắn bó với những gì bạn có. Trong trường hợp của bạn, nó có thể là giải pháp tốt nhất.Việc đăng nhập thêm có lẽ chỉ là một lỗi mà Adobe cần khắc phục. Nếu câu hỏi đăng nhập sử dụng Log4J, bạn có thể tìm thấy các tệp thuộc tính và tắt ghi nhật ký cho gói đó. Log4J là một thư viện ghi nhật ký Java phổ biến. http://stackoverflow.com/questions/4972954/how-to-disable-loggers-of-a-class-or-of-whole-package –

Trả lời

0

Bạn có thể sourround getMetaData() trong một khối try/catch, và bên trong khối catch có nó trống rỗng, thay vì e.printStackTrace tiêu chuẩn(), vì nó không phải là quan trọng đối với cách thức thực tế chạy ứng dụng.

+0

Ngoại lệ nội bộ - như đã nêu trong bài đăng của tôi - không ném một sự kiện ngoại lệ có thể bị bắt gặp. – Alex

0

Các thành phần của bạn có thường xuyên thay đổi không? Có cách nào để so sánh thời gian các tập tin đã được sửa đổi so với thời gian ngoại lệ đã được ném? Tôi với bạn về khả năng của bộ nhớ đệm gây ra điều này.

Hết sức tò mò, nếu bạn có thể, trước cuộc gọi getMetaData(), bạn có thể NULL rõ ràng đường dẫn servlet không?

getPageContext().getRequest().setAttribute("javax.servlet.include.servlet_path", javaCast("null", "")); 

Đó thể giúp đáp ứng các điều kiện NULL có mà sau đó sẽ nghỉ mát để gọi request.getServletPath() và có thể giải quyết vấn đề con đường.

Tôi đã kiểm tra nhật ký của mình và không tìm thấy lỗi như vậy, nhưng có khả năng cuộc gọi của tôi là getMetaData() không thường xuyên như của bạn.

0

Có vẻ như liên quan đến điều kiện chủng tộc hiếm hoi giữa yêu cầu (nhận dạng phiên) và khởi tạo phiên làm getMetaData() ném ngoại lệ khi sử dụng trên bất kỳ phần tử nào trong phạm vi SESSION, vì vậy nó thậm chí không phụ thuộc vào thành phần tùy chỉnh mà thay vào đó là coldfusion.runtime.SessionScope.

Rất tiếc, rất khó để tái tạo sự cố này. Đôi khi nó xảy ra nhưng sau đó nó không cho giờ hoặc thậm chí cả ngày. I filed a report at Adobe's bugbase, nhưng họ không thể xem xét điều này trừ khi tôi có thể cho biết các bước để tái sản xuất.

Các vấn đề liên quan