2012-03-12 8 views
7

Tôi đang làm việc trên một lối vào JavaScript được AJAX kích hoạt để thực hiện cuộc gọi đến một chương trình phụ trợ bằng Java được viết bằng Struts. Vấn đề của tôi là khi backend ném một ngoại lệ, máy khách vẫn thấy mã phản hồi HTTP "OK" thay vì "500 Lỗi Máy chủ Nội bộ" như mong đợi.Làm cho Struts gửi 500 lỗi máy chủ nội bộ khi ngoại lệ bị ném

Việc này thường xuyên liên tục vì thư viện JavaScript của khách hàng bên thứ ba phụ thuộc vào mã trạng thái HTTP để xác định xem có gì sai với cuộc gọi AJAX hay không, như hầu hết các thư viện hiện đại thường làm. Các lỗi vượt qua không bị phát hiện cho đến khi mã của tôi thổi lên khi nó cố phân tích cú pháp thông thường là JSON.

Tôi thực sự muốn tránh hack thư viện JS khách hàng của mình để xử lý các lỗi này một cách duyên dáng. Vì vậy, sau đó, làm thế nào tôi có thể làm cho Struts cho tôi một mã trạng thái 500 khi có được một ngoại lệ unhandled trong backend? Đây có phải là hành vi mặc định của Struts không?

Chỉnh sửa: Mã phía máy khách không liên quan trong trường hợp này. Tôi cần phải sửa chữa máy chủ để nó gửi mã trạng thái thích hợp khi các ngoại lệ chưa được giải quyết xảy ra. Cảm ơn!

Trả lời

3

tôi đã tìm ra một cách để làm điều đó. Tôi không chắc nó là tốt nhất hay dễ nhất, nhưng nó hoạt động. Tôi tìm thấy Struts Exception Configuration guide và bổ sung sau đây để tôi <package> bên struts.xml:

<global-results> 
    <result name="exception">/exception.jsp</result> 
</global-results> 

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="exception" /> 
</global-exception-mappings> 

Điều này làm cho tất cả các trường hợp ngoại lệ unhandled được chuyển hướng tới /exception.jsp. Và đây là nội dung của JSP:

<%@ taglib prefix="s" uri="/struts-tags" %> 
<%@ page contentType="application/json; charset=UTF-8" %> 
<% response.setStatus(500); %> 
{"success": false,"errors": "<s:property value="%{exception.message}"/>"} 

Bạn sẽ lưu ý trên dòng thứ 3 mà tôi tự đặt mã đối phó với 500.

này đã cho tôi một vấn đề mới: trường hợp ngoại lệ không được đăng nhập nữa . Như đã đề cập trong hướng dẫn sử dụng Struts nói trên, tôi đã giải quyết điều này bằng cách thêm dòng sau vào <package> tôi trong struts.xml cũng như:

<interceptors> 
    <interceptor-stack name="appDefaultStack"> 
     <interceptor-ref name="defaultStack"> 
      <param name="exception.logEnabled">true</param> 
      <param name="exception.logLevel">ERROR</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</interceptors> 

<default-interceptor-ref name="appDefaultStack" /> 

Struts: -1 để thực hiện một chức năng như vậy đơn giản và rõ ràng KHÔNG mặc định, và một -1 để làm cho giải pháp trở nên khó hiểu.

-1

Bạn không đề cập đến thư viện JS nào bạn đang sử dụng. Tôi khuyên bạn nên đọc kỹ tài liệu. Nếu có phương thức gọi lại nào đó, nó phải có một số responseText khác với responseCode. Bất cứ khi nào một số ngoại lệ xác nhận xảy ra ở phía máy chủ, cũng thông qua một thông báo lỗi. Chỉ cần không dựa vào việc ném một số ngoại lệ, bởi vì bạn đang sử dụng AJAX. Bạn có thể theo dõi responseText đó để hiển thị một số thông báo như "xác thực không thành công vì lý do này, vui lòng thử lại". Đồng ý ?

Nếu không ném WebApplicationException trước khi đáp ứng được cam kết:

throw new javax.ws.rs.WebApplicationException(); // or by any other constructor 

Đây là jar

+0

Thư viện phía máy khách là ExtJS nhưng điều đó không quan trọng. Máy chủ là những gì có vấn đề. Struts gửi một báo cáo lỗi HTML và một mã trạng thái "200 OK" khi có một ngoại lệ chưa được xử lý ở phía máy chủ, và đó là những gì tôi đang cố sửa chữa. HTML tôi có thể xử lý, nhưng Struts đã có thể gửi mã 500 khi lỗi xảy ra, không phải mã 200. Cảm ơn! – curtisdf

+0

'WebApplicationException()' gây ra một mã lỗi HTTP 500. bạn đã thử ném cái này chưa? – tusar

+0

Về phía máy chủ, tôi muốn tránh phải chèn các khối try/catch ở khắp mọi nơi. Tôi chỉ cần một số loại cấu hình mà nói với Struts, "làm điều đúng (tm) và cung cấp cho tôi một mã phản hồi 500 bất cứ khi nào bạn gửi các báo cáo vấn đề ngớ ngẩn." – curtisdf

0

Lỗi máy chủ nội bộ 500 là lỗi phía máy chủ, có nghĩa là sự cố có thể không xảy ra với máy tính hoặc kết nối Internet của bạn mà thay vào đó là sự cố với máy chủ của trang web.

Có lưu ý để xử lý điều này ở phía máy khách. Đó là trên máy chủ Web (máy chủ HTTP) được cấu hình để xử lý các yêu cầu.

+0

-1. Tôi nghĩ bằng cách tôi đã viết câu hỏi của mình, rõ ràng là tôi đã hiểu 500 Lỗi Máy chủ Nội bộ là gì, cũng như bản chất của các tương tác giữa máy khách và máy chủ. Tôi đã tìm kiếm thông tin về cách làm cho Struts (trên máy chủ của tôi) hành xử theo cách tôi muốn nó. – curtisdf

2

Cập nhật: Tôi đã khắc phục <global-results> phần (trong đó đã mất tích tag httpheader)

Tôi thích your solution tốt hơn, nhưng đây là một cách khác để bạn có thể làm điều đó nếu bạn không muốn gây rối w/đặt tiêu đề phản hồi trong jsp.

  1. Trong struts.xml, tạo ra một bản đồ ngoại lệ toàn cầu từ "java.lang.Exception" một kết quả có tên là "ngoại lệ"
  2. Trong struts.xml, tạo ra một kết quả toàn cầu mà bản đồ "ngoại lệ" tới kết quả của người khiếu nại với giá trị 500.
  3. Trong web.xml, tạo mục nhập trang lỗi ánh xạ mã lỗi 500 tới vị trí trang lỗi của bạn.

Vì vậy, ví struts.xml:

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="exception" /> 
</global-exception-mappings> 

<global-results> 
    <result name="exception" type="httpheader"> 
     <param name="error">500</param> 
    </result> 
</global-results> 

Và đối với web.xml

<error-page> 
    <error-code>500</error-code> 
    <location>/exception.jsp</location> 
</error-page> 

này hoạt động nhưng có một số nhược điểm lớn. Thùng chứa servlet sẽ hiển thị trang lỗi của bạn (không phải struts), do đó bạn sẽ không có quyền truy cập vào thông báo lỗi gốc hoặc struts valueStack. Ghi nhật ký ngoại lệ sẽ vẫn hoạt động, tuy nhiên (nếu bạn đã bật tính năng này).

Là một sang một bên, tôi cũng cảm thấy khó hiểu rằng thanh chống làm cho việc này trở nên khó khăn. Trong mọi khuôn khổ khác, tôi đã xử lý khái niệm trả về một trang lỗi một mã lỗi là khá nhỏ để thực hiện.