2011-01-25 26 views
8

Chúng tôi có một ứng dụng sử dụng JSF2 và Spring. Ứng dụng hoạt động tốt khi được triển khai. Nhưng điều này xảy ra nếu tôi thực hiện các bước sau:java.lang.IllegalArgumentException: null source

  1. Mở trang đăng nhập của ứng dụng.
  2. Đã triển khai lại ứng dụng trên máy chủ.
  3. Cố gắng đăng nhập bằng cách sử dụng trang đăng nhập mở trước đó, và nó cho thấy các ngoại lệ sau đây:

    javax.servlet.ServletException: null source 
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:321) 
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    
    root cause 
    
    java.lang.IllegalArgumentException: null source 
        at java.util.EventObject.<init>(EventObject.java:38) 
        at javax.faces.event.SystemEvent.<init>(SystemEvent.java:67) 
        at javax.faces.event.ComponentSystemEvent.<init>(ComponentSystemEvent.java:69) 
        at javax.faces.event.PostRestoreStateEvent.<init>(PostRestoreStateEvent.java:69) 
        at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:256) 
        at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245) 
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
        at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107) 
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 
    

Nếu tôi bấm vào trang đăng nhập đầu tiên và sau đó nhập tên đăng nhập chi tiết việc áp dụng không phá vỡ . Điều này chỉ xảy ra nếu tôi cố gắng sử dụng trang đăng nhập được tải trước đó với ứng dụng mới được triển khai.

Có ai biết câu trả lời không?

Trả lời

13

Điều này phải được ném thành ViewExpiredException. Đó là một lỗi bắt đầu xuất hiện trong Mojarra 2.0.3 và đã được sửa trong Mojarra 2.1.0. Xem thêm issue 1762 (lưu ý rằng Mojarra 2.1.0 doesn't hoạt động trên Tomcat/Jetty, sử dụng ít nhất Mojarra 2.1.1 sau đó). Về cơ bản, khi Mojarra không xây dựng hoặc khôi phục lại khung nhìn, nó thường ném một ngoại lệ đủ cụ thể, nhưng do lỗi này, một khung nhìn hợp lệ đã được dự kiến ​​không chính xác sau đó trong mã mà kết quả là IllegalArgumentException: null source. Có thể thực tế nguyên nhân có thể là chế độ xem chứa lỗi cú pháp XML đơn giản, chẳng hạn như thẻ bị thiếu hoặc giá trị thuộc tính bị hỏng, mà Mojarra thường sẽ ném một số FaceletException với thông điệp rất chi tiết với số dòng và vị trí và .

Để ngăn chặn ViewExpiredException, bạn sẽ phải làm mới trang bằng yêu cầu GET trước khi thực hiện bất kỳ hành động nào trên đó. Nếu bạn đang sử dụng phiên bản Mojarra nơi lỗi này không biểu hiện (ví dụ: 2.0.2 hoặc cũ hơn hoặc 2.1.0 trở lên), thì bạn có thể xử lý một cách duyên dáng với một số <error-page> trong trường hợp ngoại lệ cụ thể và cung cấp lỗi tùy chỉnh trang trong đó người dùng cuối được thông báo rằng phiên đã hết hạn, cùng với một liên kết đến URI yêu cầu ban đầu.

+0

Tôi đang gặp vấn đề chính xác ngay bây giờ, tôi sẽ cập nhật phiên bản mojarra của mình và xem tôi có gặp phải vấn đề tương tự hay không. – Rachel

+0

Tôi đang nhận được trang lỗi được đề cập trong trang web của mình.xml nhưng tôi muốn biết về những gì đang gây ra vấn đề này và những gì có thể là một sửa chữa thích hợp cho nó. – Rachel

+0

@Rachel: Nếu bạn đang hỏi về 'IllegalArgumentException: null source', như đã đề cập ở đoạn 1, đó là một lỗi trong Mojarra. Nâng cấp lên ít nhất 2.1.0. Đoạn 2 giải thích lỗi là gì và một nguyên nhân có thể có khác của 'IllegalArgumentException: null source' khi sử dụng Mojarra với lỗi này. Đoạn thứ 3 giải thích cách xử lý ngoại lệ * real *, đó là 'ViewExpiredException' trong trường hợp cụ thể của OP. Nếu bạn muốn biết thêm thông tin về 'ViewExpiredException', hãy kiểm tra http://stackoverflow.com/tags/viewexpiredexception/info – BalusC

4

Chừng nào javax.faces.PARTIAL_STATE_SAVING được thiết lập để sai bạn sẽ nhận được rằng java .lang.IllegalArgumentException. Nếu bạn đặt javax.faces.PARTIAL_STATE_SAVING để đúng (và bạn biết những gì bạn đang làm) bạn sẽ nhận được "tốt cũ" javax.faces.application.ViewExpiredException lại.

-1

Trong trường hợp của tôi, tôi đã thiếu thẻ kết thúc trong tệp xhtml cho một trong các cuộc gọi jstl. tôi đã sử dụng thẻ chọn và một trong số các thẻ ở giữa lựa chọn không có thẻ kết thúc

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