W swojej aplikacji webowej chciałbym mieć możliwość generowania raportów w postaci plików pdf, do tych raportów byłyby pobierane dane z bazy danych. Aplikacja jest zbudowana na Spring Boot i pobieranie danych z bazy w kontrolerze wygląda tak, że mam obiekt klasy Employee, który jest encją. Ponadto mam następujący interfejs:
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeesRepository extends CrudRepository<Employee, Long>{
}
Fragment kontrolera, w którym jest użyty powyższy interfejs, wygląda tak:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/employees")
public class EmployeesController {
@Autowired
private EmployeesRepository repository;
/*
*
*/
@RequestMapping(value="/{employeeID}/edit", method=RequestMethod.GET)
public String edit(@PathVariable long employeeID, Model model){
Employee employee = repository.findOne(employeeID);
model.addAttribute("employee", employee);
return "employee/edit";
}
}
W przypadku kontrolera wszystko działa dobrze tzn. obiekt repository zwraca encję z bazy danych na podstawię podanego id. Niestety jeśli chcę zrobić coś takiego w servletcie to ten obiekt jest nullem:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
public class ReportEmployeeServlet extends HttpServlet{
@Autowired
private EmployeesRepository repository;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/pdf");
try {
Document document = new Document();
PdfWriter.getInstance(document, response.getOutputStream());
document.open();
long employeeID = Long.parseLong(request.getParameter("employeeID"));
Employee employee = repository.findOne(employeeID);
PdfPTable table = new PdfPTable(2);
table.addCell(employeeID);
table.addCell(employee.getName());
document.add(table);
document.close();
} catch (DocumentException de) {
throw new IOException(de.getMessage());
}
}
}
Co powinienem zrobić aby obiekt repository w servletcie nie był nullem? Myślałem nad tym, żeby generowanie pdf'a przenieść do kontrolera, ale wtedy nie mam pojęcia jak zrobić żeby po wygenerowaniu raport pojawił w przeglądarce tak jak ma to miejsce w przypadku servletu. Może polecacie jakąś inną bibliotekę do tworzenia plików pdf, jak widać korzystam z iText?