@RequiredArgsConstructor public class CategoryImageViewerServlet extends HttpServlet { private final ManagedCrudService categoryImageDao; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Long imageId = Long.valueOf(request.getPathInfo().substring(1)); categoryImageDao.inTransaction(session -> { //TODO: cache session.createSelectionQuery("from CategoryDetailEntity c where c.id = :cid", CategoryDetailEntity.class) .setParameter("cid", imageId) .setCacheable(true) .uniqueResultOptional() .ifPresent(categoryDetail -> { response.setContentType("image/jpg"); response.setHeader("Content-disposition", String.format("inline; filename=\"%s.jpg\"", imageId)); try (OutputStream os = response.getOutputStream(); InputStream is = categoryDetail.getImage().getBinaryStream()) { IOUtil.fastCopy(is, os); } catch (SQLException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } }); }); } }