2010-01-06 20 views
27

Jersey kullanarak çok basit bir REST API yapıyorum ve emin olmadığım günlük dosyalarımda bir uyarı var.Jersey POST istek parametreleri nasıl uyarılır?

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.

Benim Webapp sadece eşleştirilmiş tanımlanan Jersey sunucu uygulamasını vardır/MyAPI/*

Bu uyarıların nasıl durdurabilirim

?

+0

/a/23994132/616550>. Umarım yardımcı olur! –

cevap

5

Aşağıdaki thread, aldığınız uyarıyı açıklar. Web.xml'de tanımlanmış, Jersey’in isteğinden önce işleyen bir filtreye sahip olabileceğiniz anlaşılıyor.

+2

Bu mutlaka kötü bir şey mi? Konsol/log çıktısını gizlemek için bir yol var mı? – bobber205

3

JQuery'de ajax işlevimi contentType: "application/x-www-form-urlencoded; charset=UTF-8" olarak ayarlamıştım, çünkü önceki bir çözümle (Jersey olmadan) bazı kodlama sorunlarım vardı. Mesajı kaldırdığımda ve her şey yolunda gitti.

7

Bu ileti, geliştiricilerin istek öğesi gövdesinin tüketildiği konusunda uyarmaları anlamına gelir; bu nedenle ileti gövdesini okumaya yönelik diğer girişimler başarısız olur.

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

Bu kodu nereye koyabilirim? –

+0

Istekleri sunmaya başlamadan önce, uygulamanızın başlatma bölümünde bir yere yerleştirilmelidir. –

+4

Sanırım sorunu gizlemek yerine çözmeye çalışmalısın. Benim 2 sent (Ben de yanlış olabilir). – facundofarias

1

Hakkı:

mesajı dikkate ya günlüklerinden bunu filtrelemek için güvenlidir. Bu yüzden bu sorunla uğraşıyorum ve farklı yollarla çözmeye çalışıyorum, ancak web.xml ayarlarımı değiştirmek istemedim, çünkü eğer uygulamayı Postman ile test ediyor olsaydım mükemmel çalıştı

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

ve voila, uyarı: o sözü konuyla başarısız webapp ile entegre olma edildiğinde @clijk belirtildiği gibi, ama (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.)

Yani, yalnızca üstbilgilerinizi belirlemek zorunda gitti.

Teşekkür

2

Bu uyarı yüzden sadece seviyesinde bir hata veya logback.xml veya nerede yapılandırılmış günlük kaydı var bu bileşenin için günlüğünü kapatmak için yukarı günlüğü açmak, tek şey WebComponent günlükleri olduğunu. Bu bileşenden saklanmış başka bir ileti olmadığından, bu iletiyi yok saymak için özel bir filtre yazmanız gerekmez. org.glassfish.jersey.servlet.WebComponent sürümü 2.14 den

Kaynak kod parçacığı: Bu uyarı mesajı için kullanılır

 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())); 
      } 
     } 

lokalize mesajın geçerli:

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. 

açın kapalı oturum logback.xml dosyanızdaki WebComponent gibi:

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

Benim durumumda Nesne TarihDize yöntemini değiştirdiğimde bu hata.

Hata:

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

Sabit

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

emin olduğum Content-Type: istemci üzerinde Açıkçası benim istek başlıklarına (uygulama/json, yan)

+0

Bu daha iyi bir cevap olurdu, eğer açıklayabilirseniz * neden * uygulama/x-www-form-urlencoded' yerine bunun yerine buna ihtiyacımız var. – Stewart

7

Benim için uyarı POST uygulaması/x-www-form-urlencoded için gösteriliyordu. Ve her şeyden önce bir getParameter yapar bir HiddenHttpMethodFilter sahiptir Bahar Boot kullanıyorum ... Bu yüzden bu pis geçersiz kılma yapmak sona erdi: Burada

@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

Teşekkürler! Bu benim de problemimi çözdü. – neu242

+0

Sorunlarımı da çözdüm! (Bizi bu konuya getirmiş olduğumuz çok özel (aptal) bir kurulum mu, yoksa diğer insanlar neden bu konuya girmiyor?! –

+0

Jersey MVC kullanırken bu hatayı alıyorum. override gerekli değil –