2010-01-06 41 views
27

Tôi đang xây dựng một API REST rất đơn giản bằng cách sử dụng Jersey và tôi đã nhận được cảnh báo trong các tệp nhật ký của mình mà tôi không chắc chắn.Cách khắc phục cảnh báo thông số yêu cầu Jersey POST?

WARNING: A servlet POST request, to the URI http://myserver/mycontext/myapi/users/12345?action=delete , contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

webapp của tôi chỉ có servlet Jersey xác định, ánh xạ tới/myapi/*

Làm thế nào tôi có thể ngăn chặn những cảnh báo này?

+0

Tôi đã trả lời câu hỏi này đây . Hy vọng nó giúp! –

Trả lời

5

Sau đây thread mô tả cảnh báo bạn đang nhận. Có vẻ như bạn có thể có một bộ lọc được định nghĩa trong tệp web.xml của bạn đang xử lý yêu cầu trước khi Jersey thực hiện.

+2

Đó có nhất thiết phải là một điều xấu? Có cách nào để chỉ ẩn đầu ra console/log không? – bobber205

3

Tôi chỉ có chức năng ajax trong JQuery được đặt thành contentType: "application/x-www-form-urlencoded; charset=UTF-8" vì với giải pháp trước (không có Jersey), tôi đã gặp một số sự cố mã hóa. Khi tôi xóa tin nhắn đó đã biến mất và mọi thứ hoạt động tốt.

7

Thông báo này có nghĩa là cảnh báo cho các nhà phát triển về thực tế rằng cơ quan thực thể yêu cầu đã bị tiêu thụ, do đó bất kỳ nỗ lực nào khác để đọc nội dung thư đều sẽ không thành công.

Nó là an toàn để bỏ qua tin nhắn hoặc lọc nó ra từ các bản ghi:

java.util.logging.Logger jerseyLogger = 
     java.util.logging.Logger.getLogger(WebComponent.class.getName()); 
jerseyLogger.setFilter(new Filter() { 
    @Override 
    public boolean isLoggable(LogRecord record) { 
     boolean isLoggable = true; 
     if (record.getMessage().contains("Only resource methods using @FormParam")) { 
      isLoggable = false; 
     } 
     return isLoggable; 
    } 
}); 
+0

Tôi có thể đặt mã đó ở đâu? –

+0

Nên được đặt ở đâu đó trong phần khởi tạo của ứng dụng, trước khi bạn bắt đầu phân phát các yêu cầu. –

+4

Tôi nghĩ rằng bạn nên cố gắng giải quyết vấn đề thay vì ẩn nó. 2 xu của tôi (tôi cũng có thể sai). – facundofarias

1

Đúng vậy. Vì vậy, tôi đã gặp vấn đề này và tôi đã cố gắng giải quyết nó theo nhiều cách khác nhau, nhưng tôi không muốn thay đổi cài đặt web.xml của mình, chỉ vì nếu tôi đang thử nghiệm ứng dụng của mình với Postman, nó hoạt động hoàn hảo , nhưng khi nó đã được tích hợp với các ứng dụng web nó không thành công với các vấn đề nêu (A servlet request to the URI {MY_URI} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.)

vì vậy, khi @clijk đề cập, bạn chỉ cần thiết lập tiêu đề của bạn như:

"Content-Type":"application/json" 
"charset":"UTF-8" 

và thì đấy, cảnh báo Nó đi rồi.

Cảm ơn

2

Cảnh báo này là điều duy nhất các bản ghi WebComponent, vì vậy chỉ cần bật đăng nhập lên đến LỖI mức hoặc tắt logging cho thành phần này trong logback.xml của bạn hoặc bất cứ nơi nào bạn đã cấu hình các sản phẩm gỗ. Bạn không cần viết bộ lọc tùy chỉnh để bỏ qua thông báo cụ thể này vì không có thư nào khác được ghi lại từ thành phần này.

Nguồn đoạn mã từ org.glassfish.jersey.servlet.WebComponent phiên bản 2.14:

 if(!form.asMap().isEmpty()) { 
      containerRequest.setProperty("jersey.config.server.representation.decoded.form", form); 
      if(LOGGER.isLoggable(Level.WARNING)) { 
       LOGGER.log(Level.WARNING, LocalizationMessages.FORM_PARAM_CONSUMED(containerRequest.getRequestUri())); 
      } 
     } 

Thông điệp cục bộ được sử dụng cho thông điệp cảnh báo này là:

form.param.consumed=A servlet request to the URI {0} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected. 

Bật đăng nhập tắt cho WebComponent trong tệp logback.xml của bạn như sau:

<logger name="org.glassfish.jersey.servlet.WebComponent" level="OFF" additivity="false"/> 
0

Trong trường hợp của tôi đã khắc phục lỗi này khi tôi đã thay đổi đối tượng Ngày thành Chuỗi trong phương pháp.

Lỗi:

@POST 
@Path("/myPath") 
@Produces(MediaType.APPLICATION_JSON) 
public List<MyObject> myMethod(@FormParam("StartDate") Date date) throws Exception { 

Fixed

@POST 
@Path("/myPath") 
@Produces(MediaType.APPLICATION_JSON) 
public List<MyObject> myMethod(@FormParam("StartDate") String date) throws Exception { 
3

Cuối cùng đã thoát khỏi điều này bằng cách đảm bảo tôi có Content-Type: application/json trong tiêu đề yêu cầu của tôi (rõ ràng, trên máy khách bên)

+0

Đây sẽ là một câu trả lời tốt hơn nếu bạn có thể giải thích * tại sao * chúng ta cần điều này thay vì 'application/x-www-form-urlencoded'. – Stewart

7

Đối với tôi, cảnh báo đã hiển thị cho ứng dụng POST/x-www-form-urlencoded. Và tôi đang sử dụng Spring Boot trong đó có một HiddenHttpMethodFilter mà không một getParameter trước bất cứ điều gì khác ... Vì vậy, tôi đã kết thúc làm override khó chịu này:

@Bean 
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() { 
     return new HiddenHttpMethodFilter() { 
      @Override 
      protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, 
        FilterChain filterChain) throws ServletException, IOException { 
       if ("POST".equals(request.getMethod()) 
         && request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) { 
        filterChain.doFilter(request, response); 
       } else { 
        super.doFilterInternal(request, response, filterChain); 
       } 
      } 
     }; 
    } 
+0

Cảm ơn bạn! Điều này giải quyết vấn đề của tôi là tốt. – neu242

+0

Giải quyết vấn đề của tôi quá! (Đây là một thiết lập rất đặc biệt (ngu ngốc) mà chúng tôi đã đưa chúng ta vào vấn đề này, hay tại sao những người khác lại không gặp phải vấn đề này?! –

+0

Tôi gặp lỗi này khi sử dụng Jersey MVC. –

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