Como gerar relatório usando API Rest Java? (Spring e Angular)

Peguei um exemplo de como gerar um relatório, como nunca trabalhei com API REST estou tendo muita dificuldade para gerar no meu projeto, consegui fazer gerar em outro projeto com spring mvc, thymeleaf … como posso resolver isso?
I

...
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

@CrossOrigin(origins = "http://localhost:4200")
@RestController
@RequestMapping("/api")
public class CustomerController {

@Autowired
private DataSource dataSource;

@Autowired
CustomerRepository customerRepository;

@PostMapping(value = "/customers/reportCustomer")
public ResponseEntity<String> imprimir(@RequestParam Map<String, Object> parametros, HttpServletResponse response) throws JRException, SQLException, IOException {
	
	parametros = parametros == null ? parametros = new HashMap<>() : parametros;
	
	// Pega o arquivo .jasper localizado em resources
	InputStream jasperStream = this.getClass().getResourceAsStream("/report/report_customers_list.jasper");
	
	// Cria o objeto JaperReport com o Stream do arquivo jasper
	JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperStream);
	// Passa para o JasperPrint o relatório, os parâmetros e a fonte dos dados, no caso uma conexão ao banco de dados
	JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parametros, dataSource.getConnection());

	// Configura a respota para o tipo PDF
	response.setContentType("application/pdf");
	// Define que o arquivo pode ser visualizado no navegador e também nome final do arquivo
	// para fazer download do relatório troque 'inline' por 'attachment'
	response.setHeader("Content-Disposition", "inline; filename=livros.pdf");

	// Faz a exportação do relatório para o HttpServletResponse
	final OutputStream outStream = response.getOutputStream();
	JasperExportManager.exportReportToPdfStream(jasperPrint, outStream);
	
	return new ResponseEntity<>("Customer has been create!", HttpStatus.OK);
}

@GetMapping("/customers")
public List<Customer> getAllCustomers() {
	System.out.println("Get all Customers...");

	List<Customer> customers = new ArrayList<>();
	customerRepository.findAll().forEach(customers::add);

	return customers;
}

@PostMapping(value = "/customers/create")
public Customer postCustomer(@RequestBody Customer customer) {

	Customer _customer = customerRepository.save(new Customer(customer.getName(), customer.getAge()));
	return _customer;
}
}

Creio que o Erro abaixo seja por causa do parâmetro “response”, porem não sei o que ou como alterar de forma correta.

                2018-11-28 17:19:09.460 ERROR 10476 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
            	at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2653) ~[na:1.8.0_162]
            	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2669) ~[na:1.8.0_162]
            	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3146) ~[na:1.8.0_162]
        	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:858) ~[na:1.8.0_162]
        	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:354) ~[na:1.8.0_162]
        	at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.<init>(ContextClassLoaderObjectInputStream.java:57) ~[jasperreports-6.2.0.jar:6.2.0]
        	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:277) ~[jasperreports-6.2.0.jar:6.2.0]
        	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:262) ~[jasperreports-6.2.0.jar:6.2.0]
        	at com.grokonez.jwtauthentication.controller.CustomerController.imprimir(CustomerController.java:62) ~[classes/:na]
        	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_162]
        	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_162]
        	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162]
        	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162]
        	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
        	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
        	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
        	at ......
        	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_162]
        	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_162]
        	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.34.jar:8.5.34]
        	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162]

Vamos por partes!
Inicialmente você precisa entender uma coisa importante sobre sua arquitetura, quando você estava fazendo o projeto usando o Spring MVC e o Thymeleaf você estava gerando a view e enviando ela para o cliente, então a cada nova tela o cliente iria pedir ela ao servidor e baixa-la novamente.

Quando você passou a usar REST o cliente passou a pedir dados para o servidor e o cliente atualizar a view, esse é o trabalho do Angular, pedir dados e atualizar a view.
Com isso em mente você deve considerar enviar os dados para o seu frontend(Angular) em formato JSON e ele se encarregará de exibir os dados usando alguma biblioteca para isso.

Se você estiver usando Angular 2+ recomendo essa biblioteca aqui:
Ngx-charts - https://github.com/swimlane/ngx-charts
Contudo existem várias outras opções que podem te atender.

PS* Caso você queria gerar o PDF usando o Jasperreports e disponibilizar esse PDF para o cliente baixar também é possível, talvez essa seja uma alternativa que lhe caia bem, contudo recomendo fortemente você deixar o trabalho de exibição do gráfico para o Angular, enviando apenas o JSON.

Abs