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
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 }