2013-03-05 2 views
2

필터 나에게 대신 정의 응답 상태의 500 서버 오류가 있습니다 - TimeValidationFilter 이런 내 웹 서비스에 추가 :Dropwizard - 나는 필터가

@Override 
public final void run(T configuration, Environment environment) throws Exception { 
    environment.addFilter(new TimeValidationFilter(), "/*"); 
    environment.manage(***blablabla***); 
    environment.addHealthCheck(***blablabla***); 
    try { 
     environment.addResource(new BlablaResourceImpl(configuration)); 
    } catch (ConfigurationException e) { 
     throw new IllegalStateException(e); 
    } 
} 

내 TimeValidationFilter 그냥 startTime을하고 endTime- 사용자가 null 여부를 확인한다 이 단계에서 : 내가 제대로 startTime을하고 endTime- 사용자가있을 때

public class TimeValidationFilter implements Filter { 

    public final static String START_TIME = "startTime"; 
    public final static String END_TIME = "endTime"; 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, 
      ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     String startTimeStr = request.getParameter(START_TIME); 
     String endTimeStr = request.getParameter(END_TIME); 

     if (startTimeStr == null || endTimeStr == null) { 
      throw new WebApplicationException(Response.Status.BAD_REQUEST); //line 42 
     } 
     ........ 
     chain.doFilter(req, res); 
    } 

, BlablaResourceImpl의 응답 상태가 모두 올바르게 응답 코드 (200), (400), (201)을 다시주고있다.

startTime 및 endTime없이 요청하면 400 (Response.Status.BAD_REQUEST)이 표시 될 것으로 예상됩니다.

, 당신은 ServletResponse에 오류 응답 코드를 설정할 오히려 WebApplicationException을 던지는 것보다
WARN [2013-03-05 13:13:19,490] org.eclipse.jetty.servlet.ServletHandler: /blablabla 
! javax.ws.rs.WebApplicationException: null 
! at com.*******.filters.TimeValidationFilter.doFilter(TimeValidationFilter.java:42) 
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307) 
! at com.yammer.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:29) 
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307) 
! at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453) 
! at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065) 
! at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382) 
! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999) 
! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) 
! at com.yammer.metrics.jetty.InstrumentedHandler.handle(InstrumentedHandler.java:200) 
! at org.eclipse.jetty.server.handler.GzipHandler.handle(GzipHandler.java:230) 
! at com.yammer.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:123) 
! at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) 
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111) 
! at org.eclipse.jetty.server.Server.handle(Server.java:347) 
! at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454) 
! at org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:47) 
! at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890) 
! at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944) 
! at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634) 
! at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230) 
! at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:66) 
! at org.eclipse.jetty.server.nio.BlockingChannelConnector$BlockingChannelEndPoint.run(BlockingChannelConnector.java:293) 
! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599) 
! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:534) 
! at java.lang.Thread.run(Thread.java:722) 

답변

5

:이 뜻

HttpServletResponse httpResponse = (HttpServletResponse) res; 
if (startTimeStr == null || endTimeStr == null) { 
    httpResponse.sendError(400); 
    return; 
} 
+0

을 "새로운 WebApplicationException을 던져하지만 그 대신 나는 500 서버 오류 아래 예외가 (Response.Status.BAD_REQUEST) "해야 할 일을하지 않습니까? – Shengjie

+0

및 단위 테스트 방법에 대한 아이디어가 있습니까? – Shengjie

+2

코다 (Coda)가 Dropwizard 메일 링리스트에서 말했듯이 ServletFilters는 Jersey 아래에 있고 WebApplicationException은 Jersey 구조이므로 ServletFilter는 예외를 처리하는 방법을 모르기 때문에 500 초가 걸립니다. –