Проблема с копипастом повторяющегося кода

Есть повторяющийся код в разных сервлетах. Нужно повторяющийся код как-то обработать, чтобы в дальнейшем легко править его, если нужно, а не ходить по всем листам, и не копипастить. Если есть какая-то подсказка - спасибо.

1- сервлета

public class RegisterRestServlet extends HttpServlet {
    private final ObjectMapper objectMapper = new ObjectMapper();
    private final LoginService loginService = new LoginService();
    private final RegisterDtoValidator registerDtoValidator = new RegisterDtoValidator();

    @Override
    protected void doPost (HttpServletRequest req, HttpServletResponse resp) throw ServletException, IOException{

        RegisterDto dto = this.objectMapper.readValue(req.getInputStream(), RegisterDto.class);
        try {
            this.registerDtoValidator.validate(dto);
            this.loginService.register(dto.getFirstName(), dto.getLatName(), dto.getLogin(), dto.getPassword);
        } catch (ApplicationException e){
            resp.setStatus(400);
            resp.setContentType("application/json");
            resp.getWriter().write(this.objectMapper.writeValueAsString(new ResponseDto(e.getMessage())));
            resp.getWriter().flush();
        }
    }
}

2-сервлета

public class LoginRestServlet extends HttpServlet {
    private final ObjectMapper objectMapper = new ObjectMapper();
    private final LoginService loginService = new LoginService();

    @Override
    protected void doPost (HttpServletRequest req, HttpServletResponse resp) throw ServletException, IOException{

        LoginDto dto = this.objectMapper.readValue(req.getInputStream(), LoginDto.class);
        try {
            this.loginService.login(dto.getLogin(), dto.getPassword);
        } catch (ApplicationException e){
            resp.setStatus(400);
            resp.setContentType("application/json");
            resp.getWriter().write(this.objectMapper.writeValueAsString(new ResponseDto(e.getMessage())));
            resp.getWriter().flush();
        }
    }
}

подскажите, что почитать, чтобы понять как это делаеться.


Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Как-то так:

public abstract class ServletBase<T> extends HttpServlet {
    private final ObjectMapper objectMapper = new ObjectMapper();
    private final Class<?> requestDtoClass;

    public ServletBase(Class<?> requestDtoClass) {
        this.requestDtoClass = requestDtoClass;
    }
    
    protected abstract void processPost(T requestDto);

    @Override
    protected void doPost (HttpServletRequest req, HttpServletResponse resp) throw ServletException, IOException{
        T requestDto = this.objectMapper.readValue(req.getInputStream(), requestDtoClass);
        try {
            processPost(requestDto);
        } catch (ApplicationException e){
            resp.setStatus(400);
            resp.setContentType("application/json");
            resp.getWriter().write(this.objectMapper.writeValueAsString(new ResponseDto(e.getMessage())));
            resp.getWriter().flush();
        }
    }
}

public class RegisterRestServlet extends ServletBase<RegisterDto> {
    private final LoginService loginService = new LoginService();
    private final RegisterDtoValidator registerDtoValidator = new RegisterDtoValidator();

    public RegisterRestServlet() {
        super(RegisterDto.class);
    }
   
    @Override
    protected void processPost(RegisterDto dto) {
        this.registerDtoValidator.validate(dto);
        this.loginService.register(dto.getFirstName(), dto.getLatName(), dto.getLogin(), dto.getPassword);
    }
}

public class LoginRestServlet extends ServletBase<LoginDto> {
    private final LoginService loginService = new LoginService();

    public RegisterRestServlet() {
        super(LoginDto.class);
    }
   
    @Override
    protected void processPost(LoginDto dto) {
        this.loginService.login(dto.getLogin(), dto.getPassword);
    }
}
→ Ссылка