View Javadoc
1   package common.http.error;
2   
3   import common.http.interceptor.HttpServletBiConsumer;
4   import common.http.interceptor.ServletInterceptor;
5   
6   import javax.servlet.ServletException;
7   import javax.servlet.http.HttpServletRequest;
8   import javax.servlet.http.HttpServletResponse;
9   import javax.validation.ConstraintViolation;
10  import javax.validation.ConstraintViolationException;
11  import java.io.IOException;
12  import java.util.Collection;
13  import java.util.Collections;
14  import java.util.List;
15  import java.util.stream.Collectors;
16  
17  import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
18  
19  /**
20   * @see ForwardOnError
21   */
22  public class ForwardOnErrorInterceptor extends ServletInterceptor<ForwardOnError> {
23  
24      private String page;
25  
26      @Override
27      protected void init(ForwardOnError annotation) {
28          this.page = annotation.value();
29      }
30  
31      @Override
32      public void handle(HttpServletRequest req, HttpServletResponse resp, HttpServletBiConsumer next) throws ServletException, IOException {
33          try{
34              next.handle(req,resp);
35          } catch (IllegalArgumentException e) {
36              forwardErrorPage(req, resp, SC_BAD_REQUEST, e.getMessage());
37          } catch (ConstraintViolationException e) {
38              List<String> collect = e.getConstraintViolations().stream()
39                      .map(ConstraintViolation::getMessage)
40                      .collect(Collectors.toList());
41              forwardErrorPage(req,resp,SC_BAD_REQUEST,collect);
42          }
43      }
44  
45      private void forwardErrorPage(HttpServletRequest req, HttpServletResponse resp,
46                                    int code, Collection<String> messages) throws ServletException, IOException {
47          req.setAttribute("errors", messages);
48          resp.setStatus(code);
49          req.getRequestDispatcher(page).forward(req, resp);
50      }
51  
52      private void forwardErrorPage(HttpServletRequest req, HttpServletResponse resp, int code, String message) throws IOException, ServletException {
53          List<String> singleton = message == null ? Collections.emptyList() : List.of(message);
54          forwardErrorPage(req, resp, code, singleton);
55      }
56  
57      @Override
58      public int priority() {
59          return 1;
60      }
61  }