├── .gitignore ├── Adicionando cache ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Autor.java │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── AutoresRepository.java │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ ├── AutoresResource.java │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── AutoresService.java │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ ├── AutorExistenteException.java │ │ │ ├── AutorNaoEncontradoException.java │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Adicionando comentários ao recurso Livro ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Adicionando o recurso Autor à nossa API ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Autor.java │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── AutoresRepository.java │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ ├── AutoresResource.java │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── AutoresService.java │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Autenticação com Spring Security ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── config │ │ │ └── WebSecurityConfig.java │ │ │ ├── domain │ │ │ ├── Autor.java │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── AutoresRepository.java │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ ├── AutoresResource.java │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── AutoresService.java │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ ├── AutorExistenteException.java │ │ │ ├── AutorNaoEncontradoException.java │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Buscando um livro com o uso da anotação @PathVariable ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Cliente Java ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── aplicacao │ ├── Aplicacao.java │ ├── Autor.java │ ├── Comentario.java │ ├── DetalhesErro.java │ └── Livro.java ├── Cliente JavaScript ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── algaworks │ │ └── socialbooks │ │ ├── aplicacao │ │ └── Aplicacao.java │ │ └── client │ │ ├── LivrosClient.java │ │ └── domain │ │ ├── Autor.java │ │ ├── Comentario.java │ │ ├── DetalhesErro.java │ │ └── Livro.java │ └── resources │ ├── index.html │ └── livrosClient.js ├── Criando o projeto ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ └── SocialbooksApplication.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Criando uma representação para o recurso Livro ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Cross-Origin Resource Sharing (CORS) ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── config │ │ │ └── WebSecurityConfig.java │ │ │ ├── domain │ │ │ ├── Autor.java │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── AutoresRepository.java │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ ├── AutoresResource.java │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── AutoresService.java │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ ├── AutorExistenteException.java │ │ │ ├── AutorNaoEncontradoException.java │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Deletando o recurso Livro com o DELETE ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Evoluindo nosso cliente Java ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── algaworks │ └── socialbooks │ ├── aplicacao │ └── Aplicacao.java │ └── client │ ├── LivrosClient.java │ └── domain │ ├── Autor.java │ ├── Comentario.java │ ├── DetalhesErro.java │ └── Livro.java ├── Evoluindo nosso recurso Autor ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Autor.java │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── AutoresRepository.java │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ ├── AutoresResource.java │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── AutoresService.java │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ ├── AutorExistenteException.java │ │ │ ├── AutorNaoEncontradoException.java │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Finalizando nosso cliente Java ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── algaworks │ └── socialbooks │ ├── aplicacao │ └── Aplicacao.java │ └── client │ ├── LivrosClient.java │ └── domain │ ├── Autor.java │ ├── Comentario.java │ ├── DetalhesErro.java │ └── Livro.java ├── Finalizando o tratamento das respostas ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Interagindo com o banco de dados ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Listando os comentários do recurso Livro ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Manipulando erros com @ExceptionHandler e @ControllerAdvice ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Melhorando o design do nosso código ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Modelando nosso primeiro recurso ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Negociação de conteúdos com Media Type ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Autor.java │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── AutoresRepository.java │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ ├── AutoresResource.java │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── AutoresService.java │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ ├── AutorExistenteException.java │ │ │ ├── AutorNaoEncontradoException.java │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── PUT para atualizar o recurso Livro ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Salvando o recurso Livro a partir de um POST ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Testando nossos recursos e formatando nossas representações JSON ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Autor.java │ │ │ ├── Comentario.java │ │ │ ├── DetalhesErro.java │ │ │ └── Livro.java │ │ │ ├── handler │ │ │ └── ResourceExceptionHandler.java │ │ │ ├── repository │ │ │ ├── AutoresRepository.java │ │ │ ├── ComentariosRepository.java │ │ │ └── LivrosRepository.java │ │ │ ├── resources │ │ │ ├── AutoresResource.java │ │ │ └── LivrosResources.java │ │ │ └── services │ │ │ ├── AutoresService.java │ │ │ ├── LivrosService.java │ │ │ └── exceptions │ │ │ ├── AutorExistenteException.java │ │ │ ├── AutorNaoEncontradoException.java │ │ │ └── LivroNaoEncontradoException.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Tratamento correto das respostas HTTP 404 e 201 ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ ├── repository │ │ │ └── LivrosRepository.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java ├── Utilizando a anotação @JsonInclude ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── algaworks │ │ │ └── socialbooks │ │ │ ├── SocialbooksApplication.java │ │ │ ├── domain │ │ │ ├── Comentario.java │ │ │ └── Livro.java │ │ │ └── resources │ │ │ └── LivrosResources.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── algaworks │ └── socialbooks │ └── SocialbooksApplicationTests.java └── Validando as entradas na nossa API ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── algaworks │ │ └── socialbooks │ │ ├── SocialbooksApplication.java │ │ ├── domain │ │ ├── Autor.java │ │ ├── Comentario.java │ │ ├── DetalhesErro.java │ │ └── Livro.java │ │ ├── handler │ │ └── ResourceExceptionHandler.java │ │ ├── repository │ │ ├── AutoresRepository.java │ │ ├── ComentariosRepository.java │ │ └── LivrosRepository.java │ │ ├── resources │ │ ├── AutoresResource.java │ │ └── LivrosResources.java │ │ └── services │ │ ├── AutoresService.java │ │ ├── LivrosService.java │ │ └── exceptions │ │ ├── AutorExistenteException.java │ │ ├── AutorNaoEncontradoException.java │ │ └── LivroNaoEncontradoException.java └── resources │ └── application.properties └── test └── java └── com └── algaworks └── socialbooks └── SocialbooksApplicationTests.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | .DS_Store 3 | Servers/* 4 | .metadata 5 | .settings 6 | .classpath 7 | .project 8 | target/ 9 | bin/ 10 | rebel.xml 11 | .mvn* 12 | mvnw* 13 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | import com.algaworks.socialbooks.services.exceptions.AutorExistenteException; 11 | import com.algaworks.socialbooks.services.exceptions.AutorNaoEncontradoException; 12 | 13 | @Service 14 | public class AutoresService { 15 | 16 | @Autowired 17 | private AutoresRepository autoresRepository; 18 | 19 | public List listar() { 20 | return autoresRepository.findAll(); 21 | } 22 | 23 | public Autor salvar(Autor autor) { 24 | if(autor.getId() != null) { 25 | Autor a = autoresRepository.findOne(autor.getId()); 26 | 27 | if(a != null) { 28 | throw new AutorExistenteException("O autor já existe."); 29 | } 30 | } 31 | return autoresRepository.save(autor); 32 | } 33 | 34 | public Autor buscar(Long id) { 35 | Autor autor = autoresRepository.findOne(id); 36 | 37 | if(autor == null) { 38 | throw new AutorNaoEncontradoException("O autor não pôde ser encontrado."); 39 | } 40 | return autor; 41 | } 42 | } -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorExistenteException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorExistenteException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorExistenteException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorExistenteException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Adicionando cache/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Adicionando cache/src/main/resources/application.properties -------------------------------------------------------------------------------- /Adicionando cache/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.FetchType; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.JoinColumn; 11 | import javax.persistence.ManyToOne; 12 | 13 | import com.fasterxml.jackson.annotation.JsonIgnore; 14 | 15 | @Entity 16 | public class Comentario { 17 | 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private Long id; 21 | 22 | private String texto; 23 | 24 | private String usuario; 25 | 26 | private Date data; 27 | 28 | @ManyToOne(fetch = FetchType.LAZY) 29 | @JoinColumn(name = "LIVRO_ID") 30 | @JsonIgnore 31 | private Livro livro; 32 | 33 | public Long getId() { 34 | return id; 35 | } 36 | 37 | public void setId(Long id) { 38 | this.id = id; 39 | } 40 | 41 | public String getTexto() { 42 | return texto; 43 | } 44 | 45 | public void setTexto(String texto) { 46 | this.texto = texto; 47 | } 48 | 49 | public String getUsuario() { 50 | return usuario; 51 | } 52 | 53 | public void setUsuario(String usuario) { 54 | this.usuario = usuario; 55 | } 56 | 57 | public Date getData() { 58 | return data; 59 | } 60 | 61 | public void setData(Date data) { 62 | this.data = data; 63 | } 64 | 65 | public Livro getLivro() { 66 | return livro; 67 | } 68 | 69 | public void setLivro(Livro livro) { 70 | this.livro = livro; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/java/com/algaworks/socialbooks/handler/ResourceExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.handler; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.http.HttpStatus; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.web.bind.annotation.ControllerAdvice; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | 10 | import com.algaworks.socialbooks.domain.DetalhesErro; 11 | import com.algaworks.socialbooks.services.exceptions.LivroNaoEncontradoException; 12 | 13 | @ControllerAdvice 14 | public class ResourceExceptionHandler { 15 | 16 | @ExceptionHandler(LivroNaoEncontradoException.class) 17 | public ResponseEntity handleLivroNaoEncontradoException 18 | (LivroNaoEncontradoException e, HttpServletRequest request) { 19 | 20 | DetalhesErro erro = new DetalhesErro(); 21 | erro.setStatus(404l); 22 | erro.setTitulo("O livro não pôde ser encontrado"); 23 | erro.setMensagemDesenvolvedor("http://erros.socialbooks.com/404"); 24 | erro.setTimestamp(System.currentTimeMillis()); 25 | 26 | return ResponseEntity.status(HttpStatus.NOT_FOUND).body(erro); 27 | } 28 | } -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Adicionando comentários ao recurso Livro /src/main/resources/application.properties -------------------------------------------------------------------------------- /Adicionando comentários ao recurso Livro /src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/domain/Autor.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.OneToMany; 11 | 12 | import com.fasterxml.jackson.annotation.JsonIgnore; 13 | 14 | @Entity 15 | public class Autor { 16 | 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.IDENTITY) 19 | private Long id; 20 | 21 | private String nome; 22 | 23 | private Date nascimento; 24 | 25 | private String nacionalidade; 26 | 27 | @OneToMany(mappedBy = "autor") 28 | @JsonIgnore 29 | private List livros; 30 | 31 | public Long getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Long id) { 36 | this.id = id; 37 | } 38 | 39 | public String getNome() { 40 | return nome; 41 | } 42 | 43 | public void setNome(String nome) { 44 | this.nome = nome; 45 | } 46 | 47 | public Date getNascimento() { 48 | return nascimento; 49 | } 50 | 51 | public void setNascimento(Date nascimento) { 52 | this.nascimento = nascimento; 53 | } 54 | 55 | public String getNacionalidade() { 56 | return nacionalidade; 57 | } 58 | 59 | public void setNacionalidade(String nacionalidade) { 60 | this.nacionalidade = nacionalidade; 61 | } 62 | 63 | public List getLivros() { 64 | return livros; 65 | } 66 | 67 | public void setLivros(List livros) { 68 | this.livros = livros; 69 | } 70 | 71 | } -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.FetchType; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.JoinColumn; 11 | import javax.persistence.ManyToOne; 12 | 13 | import com.fasterxml.jackson.annotation.JsonIgnore; 14 | 15 | @Entity 16 | public class Comentario { 17 | 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private Long id; 21 | 22 | private String texto; 23 | 24 | private String usuario; 25 | 26 | private Date data; 27 | 28 | @ManyToOne(fetch = FetchType.LAZY) 29 | @JoinColumn(name = "LIVRO_ID") 30 | @JsonIgnore 31 | private Livro livro; 32 | 33 | public Long getId() { 34 | return id; 35 | } 36 | 37 | public void setId(Long id) { 38 | this.id = id; 39 | } 40 | 41 | public String getTexto() { 42 | return texto; 43 | } 44 | 45 | public void setTexto(String texto) { 46 | this.texto = texto; 47 | } 48 | 49 | public String getUsuario() { 50 | return usuario; 51 | } 52 | 53 | public void setUsuario(String usuario) { 54 | this.usuario = usuario; 55 | } 56 | 57 | public Date getData() { 58 | return data; 59 | } 60 | 61 | public void setData(Date data) { 62 | this.data = data; 63 | } 64 | 65 | public Livro getLivro() { 66 | return livro; 67 | } 68 | 69 | public void setLivro(Livro livro) { 70 | this.livro = livro; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/handler/ResourceExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.handler; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.http.HttpStatus; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.web.bind.annotation.ControllerAdvice; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | 10 | import com.algaworks.socialbooks.domain.DetalhesErro; 11 | import com.algaworks.socialbooks.services.exceptions.LivroNaoEncontradoException; 12 | 13 | @ControllerAdvice 14 | public class ResourceExceptionHandler { 15 | 16 | @ExceptionHandler(LivroNaoEncontradoException.class) 17 | public ResponseEntity handleLivroNaoEncontradoException 18 | (LivroNaoEncontradoException e, HttpServletRequest request) { 19 | 20 | DetalhesErro erro = new DetalhesErro(); 21 | erro.setStatus(404l); 22 | erro.setTitulo("O livro não pôde ser encontrado"); 23 | erro.setMensagemDesenvolvedor("http://erros.socialbooks.com/404"); 24 | erro.setTimestamp(System.currentTimeMillis()); 25 | 26 | return ResponseEntity.status(HttpStatus.NOT_FOUND).body(erro); 27 | } 28 | } -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/resources/AutoresResource.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestMethod; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import com.algaworks.socialbooks.domain.Autor; 13 | import com.algaworks.socialbooks.services.AutoresService; 14 | 15 | @RestController 16 | @RequestMapping("/autores") 17 | public class AutoresResource { 18 | 19 | @Autowired 20 | private AutoresService autoresService; 21 | 22 | @RequestMapping(method = RequestMethod.GET) 23 | public ResponseEntity> listar() { 24 | List autores = autoresService.listar(); 25 | return ResponseEntity.status(HttpStatus.OK).body(autores); 26 | } 27 | 28 | } -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | 11 | @Service 12 | public class AutoresService { 13 | 14 | @Autowired 15 | private AutoresRepository autoresRepository; 16 | 17 | public List listar() { 18 | return autoresRepository.findAll(); 19 | } 20 | } -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Adicionando o recurso Autor à nossa API/src/main/resources/application.properties -------------------------------------------------------------------------------- /Adicionando o recurso Autor à nossa API/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/config/WebSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.config; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 5 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 6 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 7 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 8 | 9 | @EnableWebSecurity 10 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 11 | 12 | @Autowired 13 | public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 14 | auth.inMemoryAuthentication().withUser("algaworks") 15 | .password("s3nh4").roles("USER"); 16 | } 17 | 18 | protected void configure(HttpSecurity http) throws Exception { 19 | http. 20 | authorizeRequests() 21 | .antMatchers("/h2-console/**").permitAll() 22 | .anyRequest().authenticated() 23 | .and() 24 | .httpBasic() 25 | .and() 26 | .csrf().disable(); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | import com.algaworks.socialbooks.services.exceptions.AutorExistenteException; 11 | import com.algaworks.socialbooks.services.exceptions.AutorNaoEncontradoException; 12 | 13 | @Service 14 | public class AutoresService { 15 | 16 | @Autowired 17 | private AutoresRepository autoresRepository; 18 | 19 | public List listar() { 20 | return autoresRepository.findAll(); 21 | } 22 | 23 | public Autor salvar(Autor autor) { 24 | if(autor.getId() != null) { 25 | Autor a = autoresRepository.findOne(autor.getId()); 26 | 27 | if(a != null) { 28 | throw new AutorExistenteException("O autor já existe."); 29 | } 30 | } 31 | return autoresRepository.save(autor); 32 | } 33 | 34 | public Autor buscar(Long id) { 35 | Autor autor = autoresRepository.findOne(id); 36 | 37 | if(autor == null) { 38 | throw new AutorNaoEncontradoException("O autor não pôde ser encontrado."); 39 | } 40 | return autor; 41 | } 42 | } -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorExistenteException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorExistenteException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorExistenteException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorExistenteException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Autenticação com Spring Security/src/main/resources/application.properties -------------------------------------------------------------------------------- /Autenticação com Spring Security/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Buscando um livro com o uso da anotação @PathVariable/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Buscando um livro com o uso da anotação @PathVariable/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Buscando um livro com o uso da anotação @PathVariable/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Buscando um livro com o uso da anotação @PathVariable/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.PathVariable; 7 | import org.springframework.web.bind.annotation.RequestBody; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestMethod; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import com.algaworks.socialbooks.domain.Livro; 13 | import com.algaworks.socialbooks.repository.LivrosRepository; 14 | 15 | @RestController 16 | @RequestMapping("/livros") 17 | public class LivrosResources { 18 | 19 | @Autowired 20 | private LivrosRepository livrosRepository; 21 | 22 | @RequestMapping(method = RequestMethod.GET) 23 | public List listar() { 24 | return livrosRepository.findAll(); 25 | } 26 | 27 | @RequestMapping(method = RequestMethod.POST) 28 | public void salvar(@RequestBody Livro livro) { 29 | livrosRepository.save(livro); 30 | } 31 | 32 | @RequestMapping(value = "/{id}", method = RequestMethod.GET) 33 | public Livro buscar(@PathVariable("id") Long id) { 34 | return livrosRepository.findOne(id); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /Buscando um livro com o uso da anotação @PathVariable/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Buscando um livro com o uso da anotação @PathVariable/src/main/resources/application.properties -------------------------------------------------------------------------------- /Buscando um livro com o uso da anotação @PathVariable/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Cliente Java/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | com.algaworks.socialbooks 4 | socialbooksapi-client 5 | 1.0.0-SNAPSHOT 6 | 7 | 8 | 1.8 9 | 10 | 11 | 12 | 13 | org.springframework 14 | spring-web 15 | 4.2.5.RELEASE 16 | 17 | 18 | com.fasterxml.jackson.core 19 | jackson-databind 20 | 2.7.2 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Cliente Java/src/main/java/com/algaworks/socialbooks/aplicacao/Aplicacao.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.aplicacao; 2 | 3 | import java.net.URI; 4 | 5 | import org.springframework.http.RequestEntity; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.web.client.RestTemplate; 8 | 9 | public class Aplicacao { 10 | 11 | public static void main(String[] args) { 12 | 13 | RestTemplate restTemplate = new RestTemplate(); 14 | 15 | RequestEntity request = RequestEntity 16 | .get(URI.create("http://localhost:8080/livros")) 17 | .header("Authorization", "Basic YWxnYXdvcmtzOnMzbmg0").build(); 18 | 19 | ResponseEntity response = restTemplate.exchange(request, Livro[].class); 20 | 21 | for(Livro livro : response.getBody()) { 22 | System.out.println("Livro: " + livro.getNome()); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Cliente Java/src/main/java/com/algaworks/socialbooks/aplicacao/Autor.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Autor { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date nascimento; 16 | 17 | private String nacionalidade; 18 | 19 | private List livros; 20 | 21 | public Long getId() { 22 | return id; 23 | } 24 | 25 | public void setId(Long id) { 26 | this.id = id; 27 | } 28 | 29 | public String getNome() { 30 | return nome; 31 | } 32 | 33 | public void setNome(String nome) { 34 | this.nome = nome; 35 | } 36 | 37 | public Date getNascimento() { 38 | return nascimento; 39 | } 40 | 41 | public void setNascimento(Date nascimento) { 42 | this.nascimento = nascimento; 43 | } 44 | 45 | public String getNacionalidade() { 46 | return nacionalidade; 47 | } 48 | 49 | public void setNacionalidade(String nacionalidade) { 50 | this.nacionalidade = nacionalidade; 51 | } 52 | 53 | public List getLivros() { 54 | return livros; 55 | } 56 | 57 | public void setLivros(List livros) { 58 | this.livros = livros; 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /Cliente Java/src/main/java/com/algaworks/socialbooks/aplicacao/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | 5 | import com.fasterxml.jackson.annotation.JsonFormat; 6 | import com.fasterxml.jackson.annotation.JsonProperty; 7 | 8 | public class Comentario { 9 | 10 | private Long id; 11 | 12 | @JsonProperty("comentario") 13 | private String texto; 14 | 15 | private String usuario; 16 | 17 | @JsonFormat(pattern = "dd/MM/yyyy") 18 | private Date data; 19 | 20 | private Livro livro; 21 | 22 | public Long getId() { 23 | return id; 24 | } 25 | 26 | public void setId(Long id) { 27 | this.id = id; 28 | } 29 | 30 | public String getTexto() { 31 | return texto; 32 | } 33 | 34 | public void setTexto(String texto) { 35 | this.texto = texto; 36 | } 37 | 38 | public String getUsuario() { 39 | return usuario; 40 | } 41 | 42 | public void setUsuario(String usuario) { 43 | this.usuario = usuario; 44 | } 45 | 46 | public Date getData() { 47 | return data; 48 | } 49 | 50 | public void setData(Date data) { 51 | this.data = data; 52 | } 53 | 54 | public Livro getLivro() { 55 | return livro; 56 | } 57 | 58 | public void setLivro(Livro livro) { 59 | this.livro = livro; 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /Cliente Java/src/main/java/com/algaworks/socialbooks/aplicacao/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Cliente Java/src/main/java/com/algaworks/socialbooks/aplicacao/Livro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Livro { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date publicacao; 16 | 17 | private String editora; 18 | 19 | private String resumo; 20 | 21 | private List comentarios; 22 | 23 | private Autor autor; 24 | 25 | public Livro() {} 26 | 27 | public Livro(String nome) { 28 | this.nome = nome; 29 | } 30 | 31 | public Long getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Long id) { 36 | this.id = id; 37 | } 38 | 39 | public String getNome() { 40 | return nome; 41 | } 42 | 43 | public void setNome(String nome) { 44 | this.nome = nome; 45 | } 46 | 47 | public Date getPublicacao() { 48 | return publicacao; 49 | } 50 | 51 | public void setPublicacao(Date publicacao) { 52 | this.publicacao = publicacao; 53 | } 54 | 55 | public String getEditora() { 56 | return editora; 57 | } 58 | 59 | public void setEditora(String editora) { 60 | this.editora = editora; 61 | } 62 | 63 | public String getResumo() { 64 | return resumo; 65 | } 66 | 67 | public void setResumo(String resumo) { 68 | this.resumo = resumo; 69 | } 70 | 71 | public List getComentarios() { 72 | return comentarios; 73 | } 74 | 75 | public void setComentarios(List comentarios) { 76 | this.comentarios = comentarios; 77 | } 78 | 79 | public Autor getAutor() { 80 | return autor; 81 | } 82 | 83 | public void setAutor(Autor autor) { 84 | this.autor = autor; 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /Cliente JavaScript/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | com.algaworks.socialbooks 4 | socialbooksapi-client 5 | 1.0.0-SNAPSHOT 6 | 7 | 8 | 1.8 9 | 10 | 11 | 12 | 13 | org.springframework 14 | spring-web 15 | 4.2.5.RELEASE 16 | 17 | 18 | com.fasterxml.jackson.core 19 | jackson-databind 20 | 2.7.2 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/java/com/algaworks/socialbooks/aplicacao/Aplicacao.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.aplicacao; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.List; 6 | 7 | import com.algaworks.socialbooks.client.LivrosClient; 8 | import com.algaworks.socialbooks.client.domain.Livro; 9 | 10 | public class Aplicacao { 11 | 12 | public static void main(String[] args) throws ParseException { 13 | LivrosClient cliente = 14 | new LivrosClient("http://localhost:8080", "algaworks", "s3nh4"); 15 | 16 | List listaLivros = cliente.listar(); 17 | 18 | for(Livro livro : listaLivros) { 19 | System.out.println("Livro: " + livro.getNome()); 20 | } 21 | 22 | Livro livro = new Livro(); 23 | livro.setNome("Git passo-a-passo"); 24 | livro.setEditora("AlgaWorks"); 25 | 26 | SimpleDateFormat publicacao = new SimpleDateFormat("dd/MM/yyyy"); 27 | livro.setPublicacao(publicacao.parse("01/01/2016")); 28 | 29 | livro.setResumo("este livro aborda tecnicas de desenvolvimento de APIs."); 30 | 31 | String localizacao = cliente.salvar(livro); 32 | 33 | System.out.println("URI do livro salvo: " + localizacao); 34 | 35 | Livro livroBuscado = cliente.buscar(localizacao); 36 | 37 | System.out.println("Livro buscado: " + livroBuscado.getNome()); 38 | } 39 | } -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/java/com/algaworks/socialbooks/client/LivrosClient.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client; 2 | 3 | import java.net.URI; 4 | import java.util.Arrays; 5 | import java.util.Base64; 6 | import java.util.List; 7 | 8 | import org.springframework.http.RequestEntity; 9 | import org.springframework.http.ResponseEntity; 10 | import org.springframework.web.client.RestTemplate; 11 | 12 | import com.algaworks.socialbooks.client.domain.Livro; 13 | 14 | public class LivrosClient { 15 | 16 | private RestTemplate restTemplate; 17 | 18 | private String URI_BASE; 19 | 20 | private String URN_BASE = "/livros"; 21 | 22 | private String credencial; 23 | 24 | public LivrosClient(String url, String usuario, String senha) { 25 | restTemplate = new RestTemplate(); 26 | 27 | URI_BASE = url.concat(URN_BASE); 28 | 29 | String credencialAux = usuario + ":" + senha; 30 | 31 | credencial = "Basic " + Base64.getEncoder() 32 | .encodeToString(credencialAux.getBytes()); 33 | } 34 | 35 | public List listar() { 36 | RequestEntity request = RequestEntity 37 | .get(URI.create(URI_BASE)) 38 | .header("Authorization", credencial).build(); 39 | 40 | ResponseEntity response = restTemplate.exchange(request, Livro[].class); 41 | 42 | return Arrays.asList(response.getBody()); 43 | } 44 | 45 | public String salvar(Livro livro) { 46 | RequestEntity request = RequestEntity 47 | .post(URI.create(URI_BASE)) 48 | .header("Authorization", credencial) 49 | .body(livro); 50 | 51 | ResponseEntity response = restTemplate.exchange(request, Void.class); 52 | 53 | return response.getHeaders().getLocation().toString(); 54 | } 55 | 56 | public Livro buscar(String uri) { 57 | RequestEntity request = RequestEntity 58 | .get(URI.create(uri)) 59 | .header("Authorization", credencial) 60 | .build(); 61 | 62 | ResponseEntity response = restTemplate.exchange(request, Livro.class); 63 | 64 | return response.getBody(); 65 | } 66 | } -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/java/com/algaworks/socialbooks/client/domain/Autor.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Autor { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date nascimento; 16 | 17 | private String nacionalidade; 18 | 19 | private List livros; 20 | 21 | public Long getId() { 22 | return id; 23 | } 24 | 25 | public void setId(Long id) { 26 | this.id = id; 27 | } 28 | 29 | public String getNome() { 30 | return nome; 31 | } 32 | 33 | public void setNome(String nome) { 34 | this.nome = nome; 35 | } 36 | 37 | public Date getNascimento() { 38 | return nascimento; 39 | } 40 | 41 | public void setNascimento(Date nascimento) { 42 | this.nascimento = nascimento; 43 | } 44 | 45 | public String getNacionalidade() { 46 | return nacionalidade; 47 | } 48 | 49 | public void setNacionalidade(String nacionalidade) { 50 | this.nacionalidade = nacionalidade; 51 | } 52 | 53 | public List getLivros() { 54 | return livros; 55 | } 56 | 57 | public void setLivros(List livros) { 58 | this.livros = livros; 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/java/com/algaworks/socialbooks/client/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | 5 | import com.fasterxml.jackson.annotation.JsonFormat; 6 | import com.fasterxml.jackson.annotation.JsonProperty; 7 | 8 | public class Comentario { 9 | 10 | private Long id; 11 | 12 | @JsonProperty("comentario") 13 | private String texto; 14 | 15 | private String usuario; 16 | 17 | @JsonFormat(pattern = "dd/MM/yyyy") 18 | private Date data; 19 | 20 | private Livro livro; 21 | 22 | public Long getId() { 23 | return id; 24 | } 25 | 26 | public void setId(Long id) { 27 | this.id = id; 28 | } 29 | 30 | public String getTexto() { 31 | return texto; 32 | } 33 | 34 | public void setTexto(String texto) { 35 | this.texto = texto; 36 | } 37 | 38 | public String getUsuario() { 39 | return usuario; 40 | } 41 | 42 | public void setUsuario(String usuario) { 43 | this.usuario = usuario; 44 | } 45 | 46 | public Date getData() { 47 | return data; 48 | } 49 | 50 | public void setData(Date data) { 51 | this.data = data; 52 | } 53 | 54 | public Livro getLivro() { 55 | return livro; 56 | } 57 | 58 | public void setLivro(Livro livro) { 59 | this.livro = livro; 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/java/com/algaworks/socialbooks/client/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/java/com/algaworks/socialbooks/client/domain/Livro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Livro { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date publicacao; 16 | 17 | private String editora; 18 | 19 | private String resumo; 20 | 21 | private List comentarios; 22 | 23 | private Autor autor; 24 | 25 | public Livro() {} 26 | 27 | public Livro(String nome) { 28 | this.nome = nome; 29 | } 30 | 31 | public Long getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Long id) { 36 | this.id = id; 37 | } 38 | 39 | public String getNome() { 40 | return nome; 41 | } 42 | 43 | public void setNome(String nome) { 44 | this.nome = nome; 45 | } 46 | 47 | public Date getPublicacao() { 48 | return publicacao; 49 | } 50 | 51 | public void setPublicacao(Date publicacao) { 52 | this.publicacao = publicacao; 53 | } 54 | 55 | public String getEditora() { 56 | return editora; 57 | } 58 | 59 | public void setEditora(String editora) { 60 | this.editora = editora; 61 | } 62 | 63 | public String getResumo() { 64 | return resumo; 65 | } 66 | 67 | public void setResumo(String resumo) { 68 | this.resumo = resumo; 69 | } 70 | 71 | public List getComentarios() { 72 | return comentarios; 73 | } 74 | 75 | public void setComentarios(List comentarios) { 76 | this.comentarios = comentarios; 77 | } 78 | 79 | public Autor getAutor() { 80 | return autor; 81 | } 82 | 83 | public void setAutor(Autor autor) { 84 | this.autor = autor; 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/resources/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | :: Social Books API 6 | 7 | 8 | 9 |

10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
IDNomeEditoraPublicaçãoResumo
22 |

23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Cliente JavaScript/src/main/resources/livrosClient.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | $(".js-load-books").on('click', function() { 3 | $.ajax({ 4 | url: "http://localhost:8080/livros", 5 | type: "get", 6 | headers: { 7 | "Authorization" : "Basic YWxnYXdvcmtzOnMzbmg0" 8 | }, 9 | success: function(response) { 10 | desenhaTabela(response); 11 | } 12 | }); 13 | }) 14 | }); 15 | 16 | function desenhaTabela(dados) { 17 | $(".js-books-table-body tr").remove(); 18 | for(var i=0; i < dados.length; i++) { 19 | desenhaLinha(dados[i]); 20 | } 21 | } 22 | 23 | function desenhaLinha(linha) { 24 | var linhaTabela = $(""); 25 | $(".js-books-table-body").append(linhaTabela); 26 | linhaTabela.append("" + linha.id + ""); 27 | linhaTabela.append("" + linha.nome + ""); 28 | linhaTabela.append("" + linha.editora + ""); 29 | linhaTabela.append("" + linha.publicacao + ""); 30 | linhaTabela.append("" + linha.resumo + ""); 31 | } 32 | -------------------------------------------------------------------------------- /Criando o projeto/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-test 35 | test 36 | 37 | 38 | 39 | 40 | 41 | 42 | org.springframework.boot 43 | spring-boot-maven-plugin 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Criando o projeto/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Criando o projeto/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Criando o projeto/src/main/resources/application.properties -------------------------------------------------------------------------------- /Criando o projeto/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Criando uma representação para o recurso Livro/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-test 35 | test 36 | 37 | 38 | 39 | 40 | 41 | 42 | org.springframework.boot 43 | spring-boot-maven-plugin 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Criando uma representação para o recurso Livro/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Criando uma representação para o recurso Livro/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Criando uma representação para o recurso Livro/src/main/java/com/algaworks/socialbooks/domain/Livro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | public class Livro { 7 | 8 | private Long id; 9 | 10 | private String nome; 11 | 12 | private Date publicacao; 13 | 14 | private String editora; 15 | 16 | private String resumo; 17 | 18 | private List comentarios; 19 | 20 | private String autor; 21 | 22 | public Livro() {} 23 | 24 | public Livro(String nome) { 25 | this.nome = nome; 26 | } 27 | 28 | public Long getId() { 29 | return id; 30 | } 31 | 32 | public void setId(Long id) { 33 | this.id = id; 34 | } 35 | 36 | public String getNome() { 37 | return nome; 38 | } 39 | 40 | public void setNome(String nome) { 41 | this.nome = nome; 42 | } 43 | 44 | public Date getPublicacao() { 45 | return publicacao; 46 | } 47 | 48 | public void setPublicacao(Date publicacao) { 49 | this.publicacao = publicacao; 50 | } 51 | 52 | public String getEditora() { 53 | return editora; 54 | } 55 | 56 | public void setEditora(String editora) { 57 | this.editora = editora; 58 | } 59 | 60 | public String getResumo() { 61 | return resumo; 62 | } 63 | 64 | public void setResumo(String resumo) { 65 | this.resumo = resumo; 66 | } 67 | 68 | public List getComentarios() { 69 | return comentarios; 70 | } 71 | 72 | public void setComentarios(List comentarios) { 73 | this.comentarios = comentarios; 74 | } 75 | 76 | public String getAutor() { 77 | return autor; 78 | } 79 | 80 | public void setAutor(String autor) { 81 | this.autor = autor; 82 | } 83 | 84 | } 85 | -------------------------------------------------------------------------------- /Criando uma representação para o recurso Livro/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RequestMethod; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | import com.algaworks.socialbooks.domain.Livro; 11 | 12 | @RestController 13 | public class LivrosResources { 14 | 15 | @RequestMapping(value = "/livros", method = RequestMethod.GET) 16 | public List listar() { 17 | 18 | Livro l1 = new Livro("Rest Aplicado"); 19 | Livro l2 = new Livro("Git passo-a-passo"); 20 | 21 | Livro[] livros = {l1, l2}; 22 | 23 | return Arrays.asList(livros); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Criando uma representação para o recurso Livro/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Criando uma representação para o recurso Livro/src/main/resources/application.properties -------------------------------------------------------------------------------- /Criando uma representação para o recurso Livro/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/config/WebSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.config; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.http.HttpMethod; 5 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 6 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 7 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 8 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 9 | 10 | @EnableWebSecurity 11 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 12 | 13 | @Autowired 14 | public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 15 | auth.inMemoryAuthentication().withUser("algaworks") 16 | .password("s3nh4").roles("USER"); 17 | } 18 | 19 | protected void configure(HttpSecurity http) throws Exception { 20 | http. 21 | authorizeRequests() 22 | .antMatchers("/h2-console/**").permitAll() 23 | .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 24 | .anyRequest().authenticated() 25 | .and() 26 | .httpBasic() 27 | .and() 28 | .csrf().disable(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | import com.algaworks.socialbooks.services.exceptions.AutorExistenteException; 11 | import com.algaworks.socialbooks.services.exceptions.AutorNaoEncontradoException; 12 | 13 | @Service 14 | public class AutoresService { 15 | 16 | @Autowired 17 | private AutoresRepository autoresRepository; 18 | 19 | public List listar() { 20 | return autoresRepository.findAll(); 21 | } 22 | 23 | public Autor salvar(Autor autor) { 24 | if(autor.getId() != null) { 25 | Autor a = autoresRepository.findOne(autor.getId()); 26 | 27 | if(a != null) { 28 | throw new AutorExistenteException("O autor já existe."); 29 | } 30 | } 31 | return autoresRepository.save(autor); 32 | } 33 | 34 | public Autor buscar(Long id) { 35 | Autor autor = autoresRepository.findOne(id); 36 | 37 | if(autor == null) { 38 | throw new AutorNaoEncontradoException("O autor não pôde ser encontrado."); 39 | } 40 | return autor; 41 | } 42 | } -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorExistenteException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorExistenteException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorExistenteException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorExistenteException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Cross-Origin Resource Sharing (CORS)/src/main/resources/application.properties -------------------------------------------------------------------------------- /Cross-Origin Resource Sharing (CORS)/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Deletando o recurso Livro com o DELETE/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Deletando o recurso Livro com o DELETE/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Deletando o recurso Livro com o DELETE/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Deletando o recurso Livro com o DELETE/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Deletando o recurso Livro com o DELETE/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.PathVariable; 7 | import org.springframework.web.bind.annotation.RequestBody; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestMethod; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import com.algaworks.socialbooks.domain.Livro; 13 | import com.algaworks.socialbooks.repository.LivrosRepository; 14 | 15 | @RestController 16 | @RequestMapping("/livros") 17 | public class LivrosResources { 18 | 19 | @Autowired 20 | private LivrosRepository livrosRepository; 21 | 22 | @RequestMapping(method = RequestMethod.GET) 23 | public List listar() { 24 | return livrosRepository.findAll(); 25 | } 26 | 27 | @RequestMapping(method = RequestMethod.POST) 28 | public void salvar(@RequestBody Livro livro) { 29 | livrosRepository.save(livro); 30 | } 31 | 32 | @RequestMapping(value = "/{id}", method = RequestMethod.GET) 33 | public Livro buscar(@PathVariable("id") Long id) { 34 | return livrosRepository.findOne(id); 35 | } 36 | 37 | @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) 38 | public void deletar(@PathVariable("id") Long id) { 39 | livrosRepository.delete(id); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /Deletando o recurso Livro com o DELETE/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Deletando o recurso Livro com o DELETE/src/main/resources/application.properties -------------------------------------------------------------------------------- /Deletando o recurso Livro com o DELETE/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Evoluindo nosso cliente Java/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | com.algaworks.socialbooks 4 | socialbooksapi-client 5 | 1.0.0-SNAPSHOT 6 | 7 | 8 | 1.8 9 | 10 | 11 | 12 | 13 | org.springframework 14 | spring-web 15 | 4.2.5.RELEASE 16 | 17 | 18 | com.fasterxml.jackson.core 19 | jackson-databind 20 | 2.7.2 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Evoluindo nosso cliente Java/src/main/java/com/algaworks/socialbooks/aplicacao/Aplicacao.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.aplicacao; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.List; 6 | 7 | import com.algaworks.socialbooks.client.LivrosClient; 8 | import com.algaworks.socialbooks.client.domain.Livro; 9 | 10 | public class Aplicacao { 11 | 12 | public static void main(String[] args) throws ParseException { 13 | LivrosClient cliente = new LivrosClient(); 14 | 15 | List listaLivros = cliente.listar(); 16 | 17 | for(Livro livro : listaLivros) { 18 | System.out.println("Livro: " + livro.getNome()); 19 | } 20 | 21 | Livro livro = new Livro(); 22 | livro.setNome("Git passo-a-passo"); 23 | livro.setEditora("AlgaWorks"); 24 | 25 | SimpleDateFormat publicacao = new SimpleDateFormat("dd/MM/yyyy"); 26 | livro.setPublicacao(publicacao.parse("01/01/2016")); 27 | 28 | livro.setResumo("este livro aborda tecnicas de desenvolvimento de APIs."); 29 | 30 | String localizacao = cliente.salvar(livro); 31 | 32 | System.out.println("URI do livro salvo: " + localizacao); 33 | } 34 | } -------------------------------------------------------------------------------- /Evoluindo nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/LivrosClient.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client; 2 | 3 | import java.net.URI; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | import org.springframework.http.RequestEntity; 8 | import org.springframework.http.ResponseEntity; 9 | import org.springframework.web.client.RestTemplate; 10 | 11 | import com.algaworks.socialbooks.client.domain.Livro; 12 | 13 | public class LivrosClient { 14 | 15 | public List listar() { 16 | RestTemplate restTemplate = new RestTemplate(); 17 | 18 | RequestEntity request = RequestEntity 19 | .get(URI.create("http://localhost:8080/livros")) 20 | .header("Authorization", "Basic YWxnYXdvcmtzOnMzbmg0").build(); 21 | 22 | ResponseEntity response = restTemplate.exchange(request, Livro[].class); 23 | 24 | return Arrays.asList(response.getBody()); 25 | } 26 | 27 | public String salvar(Livro livro) { 28 | RestTemplate restTemplate = new RestTemplate(); 29 | 30 | RequestEntity request = RequestEntity 31 | .post(URI.create("http://localhost:8080/livros")) 32 | .header("Authorization", "Basic YWxnYXdvcmtzOnMzbmg0") 33 | .body(livro); 34 | 35 | ResponseEntity response = restTemplate.exchange(request, Void.class); 36 | 37 | return response.getHeaders().getLocation().toString(); 38 | } 39 | } -------------------------------------------------------------------------------- /Evoluindo nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/Autor.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Autor { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date nascimento; 16 | 17 | private String nacionalidade; 18 | 19 | private List livros; 20 | 21 | public Long getId() { 22 | return id; 23 | } 24 | 25 | public void setId(Long id) { 26 | this.id = id; 27 | } 28 | 29 | public String getNome() { 30 | return nome; 31 | } 32 | 33 | public void setNome(String nome) { 34 | this.nome = nome; 35 | } 36 | 37 | public Date getNascimento() { 38 | return nascimento; 39 | } 40 | 41 | public void setNascimento(Date nascimento) { 42 | this.nascimento = nascimento; 43 | } 44 | 45 | public String getNacionalidade() { 46 | return nacionalidade; 47 | } 48 | 49 | public void setNacionalidade(String nacionalidade) { 50 | this.nacionalidade = nacionalidade; 51 | } 52 | 53 | public List getLivros() { 54 | return livros; 55 | } 56 | 57 | public void setLivros(List livros) { 58 | this.livros = livros; 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /Evoluindo nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | 5 | import com.fasterxml.jackson.annotation.JsonFormat; 6 | import com.fasterxml.jackson.annotation.JsonProperty; 7 | 8 | public class Comentario { 9 | 10 | private Long id; 11 | 12 | @JsonProperty("comentario") 13 | private String texto; 14 | 15 | private String usuario; 16 | 17 | @JsonFormat(pattern = "dd/MM/yyyy") 18 | private Date data; 19 | 20 | private Livro livro; 21 | 22 | public Long getId() { 23 | return id; 24 | } 25 | 26 | public void setId(Long id) { 27 | this.id = id; 28 | } 29 | 30 | public String getTexto() { 31 | return texto; 32 | } 33 | 34 | public void setTexto(String texto) { 35 | this.texto = texto; 36 | } 37 | 38 | public String getUsuario() { 39 | return usuario; 40 | } 41 | 42 | public void setUsuario(String usuario) { 43 | this.usuario = usuario; 44 | } 45 | 46 | public Date getData() { 47 | return data; 48 | } 49 | 50 | public void setData(Date data) { 51 | this.data = data; 52 | } 53 | 54 | public Livro getLivro() { 55 | return livro; 56 | } 57 | 58 | public void setLivro(Livro livro) { 59 | this.livro = livro; 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /Evoluindo nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Evoluindo nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/Livro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Livro { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date publicacao; 16 | 17 | private String editora; 18 | 19 | private String resumo; 20 | 21 | private List comentarios; 22 | 23 | private Autor autor; 24 | 25 | public Livro() {} 26 | 27 | public Livro(String nome) { 28 | this.nome = nome; 29 | } 30 | 31 | public Long getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Long id) { 36 | this.id = id; 37 | } 38 | 39 | public String getNome() { 40 | return nome; 41 | } 42 | 43 | public void setNome(String nome) { 44 | this.nome = nome; 45 | } 46 | 47 | public Date getPublicacao() { 48 | return publicacao; 49 | } 50 | 51 | public void setPublicacao(Date publicacao) { 52 | this.publicacao = publicacao; 53 | } 54 | 55 | public String getEditora() { 56 | return editora; 57 | } 58 | 59 | public void setEditora(String editora) { 60 | this.editora = editora; 61 | } 62 | 63 | public String getResumo() { 64 | return resumo; 65 | } 66 | 67 | public void setResumo(String resumo) { 68 | this.resumo = resumo; 69 | } 70 | 71 | public List getComentarios() { 72 | return comentarios; 73 | } 74 | 75 | public void setComentarios(List comentarios) { 76 | this.comentarios = comentarios; 77 | } 78 | 79 | public Autor getAutor() { 80 | return autor; 81 | } 82 | 83 | public void setAutor(Autor autor) { 84 | this.autor = autor; 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/domain/Autor.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.OneToMany; 11 | 12 | import com.fasterxml.jackson.annotation.JsonIgnore; 13 | 14 | @Entity 15 | public class Autor { 16 | 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.IDENTITY) 19 | private Long id; 20 | 21 | private String nome; 22 | 23 | private Date nascimento; 24 | 25 | private String nacionalidade; 26 | 27 | @OneToMany(mappedBy = "autor") 28 | @JsonIgnore 29 | private List livros; 30 | 31 | public Long getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Long id) { 36 | this.id = id; 37 | } 38 | 39 | public String getNome() { 40 | return nome; 41 | } 42 | 43 | public void setNome(String nome) { 44 | this.nome = nome; 45 | } 46 | 47 | public Date getNascimento() { 48 | return nascimento; 49 | } 50 | 51 | public void setNascimento(Date nascimento) { 52 | this.nascimento = nascimento; 53 | } 54 | 55 | public String getNacionalidade() { 56 | return nacionalidade; 57 | } 58 | 59 | public void setNacionalidade(String nacionalidade) { 60 | this.nacionalidade = nacionalidade; 61 | } 62 | 63 | public List getLivros() { 64 | return livros; 65 | } 66 | 67 | public void setLivros(List livros) { 68 | this.livros = livros; 69 | } 70 | 71 | } -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.FetchType; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.JoinColumn; 11 | import javax.persistence.ManyToOne; 12 | 13 | import com.fasterxml.jackson.annotation.JsonIgnore; 14 | 15 | @Entity 16 | public class Comentario { 17 | 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private Long id; 21 | 22 | private String texto; 23 | 24 | private String usuario; 25 | 26 | private Date data; 27 | 28 | @ManyToOne(fetch = FetchType.LAZY) 29 | @JoinColumn(name = "LIVRO_ID") 30 | @JsonIgnore 31 | private Livro livro; 32 | 33 | public Long getId() { 34 | return id; 35 | } 36 | 37 | public void setId(Long id) { 38 | this.id = id; 39 | } 40 | 41 | public String getTexto() { 42 | return texto; 43 | } 44 | 45 | public void setTexto(String texto) { 46 | this.texto = texto; 47 | } 48 | 49 | public String getUsuario() { 50 | return usuario; 51 | } 52 | 53 | public void setUsuario(String usuario) { 54 | this.usuario = usuario; 55 | } 56 | 57 | public Date getData() { 58 | return data; 59 | } 60 | 61 | public void setData(Date data) { 62 | this.data = data; 63 | } 64 | 65 | public Livro getLivro() { 66 | return livro; 67 | } 68 | 69 | public void setLivro(Livro livro) { 70 | this.livro = livro; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/resources/AutoresResource.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.net.URI; 4 | import java.util.List; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.http.HttpStatus; 8 | import org.springframework.http.ResponseEntity; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RequestMethod; 13 | import org.springframework.web.bind.annotation.RestController; 14 | import org.springframework.web.servlet.support.ServletUriComponentsBuilder; 15 | 16 | import com.algaworks.socialbooks.domain.Autor; 17 | import com.algaworks.socialbooks.services.AutoresService; 18 | 19 | @RestController 20 | @RequestMapping("/autores") 21 | public class AutoresResource { 22 | 23 | @Autowired 24 | private AutoresService autoresService; 25 | 26 | @RequestMapping(method = RequestMethod.GET) 27 | public ResponseEntity> listar() { 28 | List autores = autoresService.listar(); 29 | return ResponseEntity.status(HttpStatus.OK).body(autores); 30 | } 31 | 32 | @RequestMapping(method = RequestMethod.POST) 33 | public ResponseEntity salvar(@RequestBody Autor autor) { 34 | autor = autoresService.salvar(autor); 35 | 36 | URI uri = ServletUriComponentsBuilder.fromCurrentRequest() 37 | .path("/{id}").buildAndExpand(autor.getId()).toUri(); 38 | 39 | return ResponseEntity.created(uri).build(); 40 | } 41 | 42 | @RequestMapping(value = "/{id}", method = RequestMethod.GET) 43 | public ResponseEntity buscar(@PathVariable("id") Long id) { 44 | Autor autor = autoresService.buscar(id); 45 | return ResponseEntity.status(HttpStatus.OK).body(autor); 46 | } 47 | } -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | import com.algaworks.socialbooks.services.exceptions.AutorExistenteException; 11 | import com.algaworks.socialbooks.services.exceptions.AutorNaoEncontradoException; 12 | 13 | @Service 14 | public class AutoresService { 15 | 16 | @Autowired 17 | private AutoresRepository autoresRepository; 18 | 19 | public List listar() { 20 | return autoresRepository.findAll(); 21 | } 22 | 23 | public Autor salvar(Autor autor) { 24 | if(autor.getId() != null) { 25 | Autor a = autoresRepository.findOne(autor.getId()); 26 | 27 | if(a != null) { 28 | throw new AutorExistenteException("O autor já existe."); 29 | } 30 | } 31 | return autoresRepository.save(autor); 32 | } 33 | 34 | public Autor buscar(Long id) { 35 | Autor autor = autoresRepository.findOne(id); 36 | 37 | if(autor == null) { 38 | throw new AutorNaoEncontradoException("O autor não pôde ser encontrado."); 39 | } 40 | return autor; 41 | } 42 | } -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorExistenteException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorExistenteException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorExistenteException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorExistenteException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Evoluindo nosso recurso Autor/src/main/resources/application.properties -------------------------------------------------------------------------------- /Evoluindo nosso recurso Autor/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Finalizando nosso cliente Java/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | com.algaworks.socialbooks 4 | socialbooksapi-client 5 | 1.0.0-SNAPSHOT 6 | 7 | 8 | 1.8 9 | 10 | 11 | 12 | 13 | org.springframework 14 | spring-web 15 | 4.2.5.RELEASE 16 | 17 | 18 | com.fasterxml.jackson.core 19 | jackson-databind 20 | 2.7.2 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /Finalizando nosso cliente Java/src/main/java/com/algaworks/socialbooks/aplicacao/Aplicacao.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.aplicacao; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.List; 6 | 7 | import com.algaworks.socialbooks.client.LivrosClient; 8 | import com.algaworks.socialbooks.client.domain.Livro; 9 | 10 | public class Aplicacao { 11 | 12 | public static void main(String[] args) throws ParseException { 13 | LivrosClient cliente = 14 | new LivrosClient("http://localhost:8080", "algaworks", "s3nh4"); 15 | 16 | List listaLivros = cliente.listar(); 17 | 18 | for(Livro livro : listaLivros) { 19 | System.out.println("Livro: " + livro.getNome()); 20 | } 21 | 22 | Livro livro = new Livro(); 23 | livro.setNome("Git passo-a-passo"); 24 | livro.setEditora("AlgaWorks"); 25 | 26 | SimpleDateFormat publicacao = new SimpleDateFormat("dd/MM/yyyy"); 27 | livro.setPublicacao(publicacao.parse("01/01/2016")); 28 | 29 | livro.setResumo("este livro aborda tecnicas de desenvolvimento de APIs."); 30 | 31 | String localizacao = cliente.salvar(livro); 32 | 33 | System.out.println("URI do livro salvo: " + localizacao); 34 | 35 | Livro livroBuscado = cliente.buscar(localizacao); 36 | 37 | System.out.println("Livro buscado: " + livroBuscado.getNome()); 38 | } 39 | } -------------------------------------------------------------------------------- /Finalizando nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/Autor.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Autor { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date nascimento; 16 | 17 | private String nacionalidade; 18 | 19 | private List livros; 20 | 21 | public Long getId() { 22 | return id; 23 | } 24 | 25 | public void setId(Long id) { 26 | this.id = id; 27 | } 28 | 29 | public String getNome() { 30 | return nome; 31 | } 32 | 33 | public void setNome(String nome) { 34 | this.nome = nome; 35 | } 36 | 37 | public Date getNascimento() { 38 | return nascimento; 39 | } 40 | 41 | public void setNascimento(Date nascimento) { 42 | this.nascimento = nascimento; 43 | } 44 | 45 | public String getNacionalidade() { 46 | return nacionalidade; 47 | } 48 | 49 | public void setNacionalidade(String nacionalidade) { 50 | this.nacionalidade = nacionalidade; 51 | } 52 | 53 | public List getLivros() { 54 | return livros; 55 | } 56 | 57 | public void setLivros(List livros) { 58 | this.livros = livros; 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /Finalizando nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | 5 | import com.fasterxml.jackson.annotation.JsonFormat; 6 | import com.fasterxml.jackson.annotation.JsonProperty; 7 | 8 | public class Comentario { 9 | 10 | private Long id; 11 | 12 | @JsonProperty("comentario") 13 | private String texto; 14 | 15 | private String usuario; 16 | 17 | @JsonFormat(pattern = "dd/MM/yyyy") 18 | private Date data; 19 | 20 | private Livro livro; 21 | 22 | public Long getId() { 23 | return id; 24 | } 25 | 26 | public void setId(Long id) { 27 | this.id = id; 28 | } 29 | 30 | public String getTexto() { 31 | return texto; 32 | } 33 | 34 | public void setTexto(String texto) { 35 | this.texto = texto; 36 | } 37 | 38 | public String getUsuario() { 39 | return usuario; 40 | } 41 | 42 | public void setUsuario(String usuario) { 43 | this.usuario = usuario; 44 | } 45 | 46 | public Date getData() { 47 | return data; 48 | } 49 | 50 | public void setData(Date data) { 51 | this.data = data; 52 | } 53 | 54 | public Livro getLivro() { 55 | return livro; 56 | } 57 | 58 | public void setLivro(Livro livro) { 59 | this.livro = livro; 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /Finalizando nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Finalizando nosso cliente Java/src/main/java/com/algaworks/socialbooks/client/domain/Livro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.client.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | 8 | public class Livro { 9 | 10 | private Long id; 11 | 12 | private String nome; 13 | 14 | @JsonFormat(pattern = "dd/MM/yyyy") 15 | private Date publicacao; 16 | 17 | private String editora; 18 | 19 | private String resumo; 20 | 21 | private List comentarios; 22 | 23 | private Autor autor; 24 | 25 | public Livro() {} 26 | 27 | public Livro(String nome) { 28 | this.nome = nome; 29 | } 30 | 31 | public Long getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Long id) { 36 | this.id = id; 37 | } 38 | 39 | public String getNome() { 40 | return nome; 41 | } 42 | 43 | public void setNome(String nome) { 44 | this.nome = nome; 45 | } 46 | 47 | public Date getPublicacao() { 48 | return publicacao; 49 | } 50 | 51 | public void setPublicacao(Date publicacao) { 52 | this.publicacao = publicacao; 53 | } 54 | 55 | public String getEditora() { 56 | return editora; 57 | } 58 | 59 | public void setEditora(String editora) { 60 | this.editora = editora; 61 | } 62 | 63 | public String getResumo() { 64 | return resumo; 65 | } 66 | 67 | public void setResumo(String resumo) { 68 | this.resumo = resumo; 69 | } 70 | 71 | public List getComentarios() { 72 | return comentarios; 73 | } 74 | 75 | public void setComentarios(List comentarios) { 76 | this.comentarios = comentarios; 77 | } 78 | 79 | public Autor getAutor() { 80 | return autor; 81 | } 82 | 83 | public void setAutor(Autor autor) { 84 | this.autor = autor; 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /Finalizando o tratamento das respostas/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Finalizando o tratamento das respostas/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Finalizando o tratamento das respostas/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Finalizando o tratamento das respostas/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Finalizando o tratamento das respostas/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Finalizando o tratamento das respostas/src/main/resources/application.properties -------------------------------------------------------------------------------- /Finalizando o tratamento das respostas/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Interagindo com o banco de dados/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Interagindo com o banco de dados/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Interagindo com o banco de dados/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Interagindo com o banco de dados/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Interagindo com o banco de dados/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RequestMethod; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | import com.algaworks.socialbooks.domain.Livro; 11 | import com.algaworks.socialbooks.repository.LivrosRepository; 12 | 13 | @RestController 14 | public class LivrosResources { 15 | 16 | @Autowired 17 | private LivrosRepository livrosRepository; 18 | 19 | @RequestMapping(value = "/livros", method = RequestMethod.GET) 20 | public List listar() { 21 | return livrosRepository.findAll(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /Interagindo com o banco de dados/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Interagindo com o banco de dados/src/main/resources/application.properties -------------------------------------------------------------------------------- /Interagindo com o banco de dados/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.FetchType; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.JoinColumn; 11 | import javax.persistence.ManyToOne; 12 | 13 | import com.fasterxml.jackson.annotation.JsonIgnore; 14 | 15 | @Entity 16 | public class Comentario { 17 | 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private Long id; 21 | 22 | private String texto; 23 | 24 | private String usuario; 25 | 26 | private Date data; 27 | 28 | @ManyToOne(fetch = FetchType.LAZY) 29 | @JoinColumn(name = "LIVRO_ID") 30 | @JsonIgnore 31 | private Livro livro; 32 | 33 | public Long getId() { 34 | return id; 35 | } 36 | 37 | public void setId(Long id) { 38 | this.id = id; 39 | } 40 | 41 | public String getTexto() { 42 | return texto; 43 | } 44 | 45 | public void setTexto(String texto) { 46 | this.texto = texto; 47 | } 48 | 49 | public String getUsuario() { 50 | return usuario; 51 | } 52 | 53 | public void setUsuario(String usuario) { 54 | this.usuario = usuario; 55 | } 56 | 57 | public Date getData() { 58 | return data; 59 | } 60 | 61 | public void setData(Date data) { 62 | this.data = data; 63 | } 64 | 65 | public Livro getLivro() { 66 | return livro; 67 | } 68 | 69 | public void setLivro(Livro livro) { 70 | this.livro = livro; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/java/com/algaworks/socialbooks/handler/ResourceExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.handler; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.http.HttpStatus; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.web.bind.annotation.ControllerAdvice; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | 10 | import com.algaworks.socialbooks.domain.DetalhesErro; 11 | import com.algaworks.socialbooks.services.exceptions.LivroNaoEncontradoException; 12 | 13 | @ControllerAdvice 14 | public class ResourceExceptionHandler { 15 | 16 | @ExceptionHandler(LivroNaoEncontradoException.class) 17 | public ResponseEntity handleLivroNaoEncontradoException 18 | (LivroNaoEncontradoException e, HttpServletRequest request) { 19 | 20 | DetalhesErro erro = new DetalhesErro(); 21 | erro.setStatus(404l); 22 | erro.setTitulo("O livro não pôde ser encontrado"); 23 | erro.setMensagemDesenvolvedor("http://erros.socialbooks.com/404"); 24 | erro.setTimestamp(System.currentTimeMillis()); 25 | 26 | return ResponseEntity.status(HttpStatus.NOT_FOUND).body(erro); 27 | } 28 | } -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Listando os comentários do recurso Livro /src/main/resources/application.properties -------------------------------------------------------------------------------- /Listando os comentários do recurso Livro /src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/java/com/algaworks/socialbooks/handler/ResourceExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.handler; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.http.HttpStatus; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.web.bind.annotation.ControllerAdvice; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | 10 | import com.algaworks.socialbooks.domain.DetalhesErro; 11 | import com.algaworks.socialbooks.services.exceptions.LivroNaoEncontradoException; 12 | 13 | @ControllerAdvice 14 | public class ResourceExceptionHandler { 15 | 16 | @ExceptionHandler(LivroNaoEncontradoException.class) 17 | public ResponseEntity handleLivroNaoEncontradoException 18 | (LivroNaoEncontradoException e, HttpServletRequest request) { 19 | 20 | DetalhesErro erro = new DetalhesErro(); 21 | erro.setStatus(404l); 22 | erro.setTitulo("O livro não pôde ser encontrado"); 23 | erro.setMensagemDesenvolvedor("http://erros.socialbooks.com/404"); 24 | erro.setTimestamp(System.currentTimeMillis()); 25 | 26 | return ResponseEntity.status(HttpStatus.NOT_FOUND).body(erro); 27 | } 28 | } -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/java/com/algaworks/socialbooks/services/LivrosService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.dao.EmptyResultDataAccessException; 7 | import org.springframework.stereotype.Service; 8 | 9 | import com.algaworks.socialbooks.domain.Livro; 10 | import com.algaworks.socialbooks.repository.LivrosRepository; 11 | import com.algaworks.socialbooks.services.exceptions.LivroNaoEncontradoException; 12 | 13 | @Service 14 | public class LivrosService { 15 | 16 | @Autowired 17 | private LivrosRepository livrosRepository; 18 | 19 | public List listar() { 20 | return livrosRepository.findAll(); 21 | } 22 | 23 | public Livro buscar(Long id) { 24 | Livro livro = livrosRepository.findOne(id); 25 | 26 | if(livro == null) { 27 | throw new LivroNaoEncontradoException("O livro não pôde ser encontrado."); 28 | } 29 | 30 | return livro; 31 | } 32 | 33 | public Livro salvar(Livro livro) { 34 | livro.setId(null); 35 | return livrosRepository.save(livro); 36 | } 37 | 38 | public void deletar(Long id) { 39 | try { 40 | livrosRepository.delete(id); 41 | } catch (EmptyResultDataAccessException e) { 42 | throw new LivroNaoEncontradoException("O livro não pôde ser encontrado."); 43 | } 44 | } 45 | 46 | public void atualizar(Livro livro) { 47 | verificarExistencia(livro); 48 | livrosRepository.save(livro); 49 | } 50 | 51 | private void verificarExistencia(Livro livro) { 52 | buscar(livro.getId()); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/main/resources/application.properties -------------------------------------------------------------------------------- /Manipulando erros com @ExceptionHandler e @ControllerAdvice/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Melhorando o design do nosso código/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Melhorando o design do nosso código/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Melhorando o design do nosso código/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Melhorando o design do nosso código/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Melhorando o design do nosso código/src/main/java/com/algaworks/socialbooks/services/LivrosService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.dao.EmptyResultDataAccessException; 7 | import org.springframework.stereotype.Service; 8 | 9 | import com.algaworks.socialbooks.domain.Livro; 10 | import com.algaworks.socialbooks.repository.LivrosRepository; 11 | import com.algaworks.socialbooks.services.exceptions.LivroNaoEncontradoException; 12 | 13 | @Service 14 | public class LivrosService { 15 | 16 | @Autowired 17 | private LivrosRepository livrosRepository; 18 | 19 | public List listar() { 20 | return livrosRepository.findAll(); 21 | } 22 | 23 | public Livro buscar(Long id) { 24 | Livro livro = livrosRepository.findOne(id); 25 | 26 | if(livro == null) { 27 | throw new LivroNaoEncontradoException("O livro não pôde ser encontrado."); 28 | } 29 | 30 | return livro; 31 | } 32 | 33 | public Livro salvar(Livro livro) { 34 | livro.setId(null); 35 | return livrosRepository.save(livro); 36 | } 37 | 38 | public void deletar(Long id) { 39 | try { 40 | livrosRepository.delete(id); 41 | } catch (EmptyResultDataAccessException e) { 42 | throw new LivroNaoEncontradoException("O livro não pôde ser encontrado."); 43 | } 44 | } 45 | 46 | public void atualizar(Livro livro) { 47 | verificarExistencia(livro); 48 | livrosRepository.save(livro); 49 | } 50 | 51 | private void verificarExistencia(Livro livro) { 52 | buscar(livro.getId()); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /Melhorando o design do nosso código/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Melhorando o design do nosso código/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Melhorando o design do nosso código/src/main/resources/application.properties -------------------------------------------------------------------------------- /Melhorando o design do nosso código/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Modelando nosso primeiro recurso/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-test 35 | test 36 | 37 | 38 | 39 | 40 | 41 | 42 | org.springframework.boot 43 | spring-boot-maven-plugin 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Modelando nosso primeiro recurso/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Modelando nosso primeiro recurso/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import org.springframework.web.bind.annotation.RequestMapping; 4 | import org.springframework.web.bind.annotation.RequestMethod; 5 | import org.springframework.web.bind.annotation.RestController; 6 | 7 | @RestController 8 | public class LivrosResources { 9 | 10 | @RequestMapping(value = "/livros", method = RequestMethod.GET) 11 | public String listar() { 12 | return "Rest aplicado, Git passo-a-passo"; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Modelando nosso primeiro recurso/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Modelando nosso primeiro recurso/src/main/resources/application.properties -------------------------------------------------------------------------------- /Modelando nosso primeiro recurso/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | import com.algaworks.socialbooks.services.exceptions.AutorExistenteException; 11 | import com.algaworks.socialbooks.services.exceptions.AutorNaoEncontradoException; 12 | 13 | @Service 14 | public class AutoresService { 15 | 16 | @Autowired 17 | private AutoresRepository autoresRepository; 18 | 19 | public List listar() { 20 | return autoresRepository.findAll(); 21 | } 22 | 23 | public Autor salvar(Autor autor) { 24 | if(autor.getId() != null) { 25 | Autor a = autoresRepository.findOne(autor.getId()); 26 | 27 | if(a != null) { 28 | throw new AutorExistenteException("O autor já existe."); 29 | } 30 | } 31 | return autoresRepository.save(autor); 32 | } 33 | 34 | public Autor buscar(Long id) { 35 | Autor autor = autoresRepository.findOne(id); 36 | 37 | if(autor == null) { 38 | throw new AutorNaoEncontradoException("O autor não pôde ser encontrado."); 39 | } 40 | return autor; 41 | } 42 | } -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorExistenteException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorExistenteException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorExistenteException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorExistenteException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Negociação de conteúdos com Media Type/src/main/resources/application.properties -------------------------------------------------------------------------------- /Negociação de conteúdos com Media Type/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /PUT para atualizar o recurso Livro/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /PUT para atualizar o recurso Livro/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /PUT para atualizar o recurso Livro/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /PUT para atualizar o recurso Livro/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /PUT para atualizar o recurso Livro/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.PathVariable; 7 | import org.springframework.web.bind.annotation.RequestBody; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestMethod; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import com.algaworks.socialbooks.domain.Livro; 13 | import com.algaworks.socialbooks.repository.LivrosRepository; 14 | 15 | @RestController 16 | @RequestMapping("/livros") 17 | public class LivrosResources { 18 | 19 | @Autowired 20 | private LivrosRepository livrosRepository; 21 | 22 | @RequestMapping(method = RequestMethod.GET) 23 | public List listar() { 24 | return livrosRepository.findAll(); 25 | } 26 | 27 | @RequestMapping(method = RequestMethod.POST) 28 | public void salvar(@RequestBody Livro livro) { 29 | livrosRepository.save(livro); 30 | } 31 | 32 | @RequestMapping(value = "/{id}", method = RequestMethod.GET) 33 | public Livro buscar(@PathVariable("id") Long id) { 34 | return livrosRepository.findOne(id); 35 | } 36 | 37 | @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) 38 | public void deletar(@PathVariable("id") Long id) { 39 | livrosRepository.delete(id); 40 | } 41 | 42 | @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 43 | public void atualizar(@RequestBody Livro livro, @PathVariable("id") Long id) { 44 | livro.setId(id); 45 | livrosRepository.save(livro); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /PUT para atualizar o recurso Livro/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/PUT para atualizar o recurso Livro/src/main/resources/application.properties -------------------------------------------------------------------------------- /PUT para atualizar o recurso Livro/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Salvando o recurso Livro a partir de um POST/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Salvando o recurso Livro a partir de um POST/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Salvando o recurso Livro a partir de um POST/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Salvando o recurso Livro a partir de um POST/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Salvando o recurso Livro a partir de um POST/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.RequestBody; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | import org.springframework.web.bind.annotation.RequestMethod; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | import com.algaworks.socialbooks.domain.Livro; 12 | import com.algaworks.socialbooks.repository.LivrosRepository; 13 | 14 | @RestController 15 | @RequestMapping("/livros") 16 | public class LivrosResources { 17 | 18 | @Autowired 19 | private LivrosRepository livrosRepository; 20 | 21 | @RequestMapping(method = RequestMethod.GET) 22 | public List listar() { 23 | return livrosRepository.findAll(); 24 | } 25 | 26 | @RequestMapping(method = RequestMethod.POST) 27 | public void salvar(@RequestBody Livro livro) { 28 | livrosRepository.save(livro); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Salvando o recurso Livro a partir de um POST/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Salvando o recurso Livro a partir de um POST/src/main/resources/application.properties -------------------------------------------------------------------------------- /Salvando o recurso Livro a partir de um POST/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/domain/Autor.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.OneToMany; 11 | 12 | import com.fasterxml.jackson.annotation.JsonFormat; 13 | import com.fasterxml.jackson.annotation.JsonIgnore; 14 | import com.fasterxml.jackson.annotation.JsonInclude; 15 | import com.fasterxml.jackson.annotation.JsonInclude.Include; 16 | 17 | @Entity 18 | public class Autor { 19 | 20 | @Id 21 | @GeneratedValue(strategy = GenerationType.IDENTITY) 22 | private Long id; 23 | 24 | private String nome; 25 | 26 | @JsonFormat(pattern = "dd/MM/yyyy") 27 | @JsonInclude(Include.NON_NULL) 28 | private Date nascimento; 29 | 30 | @JsonInclude(Include.NON_NULL) 31 | private String nacionalidade; 32 | 33 | @OneToMany(mappedBy = "autor") 34 | @JsonIgnore 35 | private List livros; 36 | 37 | public Long getId() { 38 | return id; 39 | } 40 | 41 | public void setId(Long id) { 42 | this.id = id; 43 | } 44 | 45 | public String getNome() { 46 | return nome; 47 | } 48 | 49 | public void setNome(String nome) { 50 | this.nome = nome; 51 | } 52 | 53 | public Date getNascimento() { 54 | return nascimento; 55 | } 56 | 57 | public void setNascimento(Date nascimento) { 58 | this.nascimento = nascimento; 59 | } 60 | 61 | public String getNacionalidade() { 62 | return nacionalidade; 63 | } 64 | 65 | public void setNacionalidade(String nacionalidade) { 66 | this.nacionalidade = nacionalidade; 67 | } 68 | 69 | public List getLivros() { 70 | return livros; 71 | } 72 | 73 | public void setLivros(List livros) { 74 | this.livros = livros; 75 | } 76 | 77 | } -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.FetchType; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.GenerationType; 9 | import javax.persistence.Id; 10 | import javax.persistence.JoinColumn; 11 | import javax.persistence.ManyToOne; 12 | 13 | import com.fasterxml.jackson.annotation.JsonFormat; 14 | import com.fasterxml.jackson.annotation.JsonIgnore; 15 | import com.fasterxml.jackson.annotation.JsonInclude; 16 | import com.fasterxml.jackson.annotation.JsonInclude.Include; 17 | 18 | @Entity 19 | public class Comentario { 20 | 21 | @Id 22 | @GeneratedValue(strategy = GenerationType.IDENTITY) 23 | private Long id; 24 | 25 | private String texto; 26 | 27 | @JsonInclude(Include.NON_NULL) 28 | private String usuario; 29 | 30 | @JsonFormat(pattern = "dd/MM/yyyy") 31 | @JsonInclude(Include.NON_NULL) 32 | private Date data; 33 | 34 | @ManyToOne(fetch = FetchType.LAZY) 35 | @JoinColumn(name = "LIVRO_ID") 36 | @JsonIgnore 37 | private Livro livro; 38 | 39 | public Long getId() { 40 | return id; 41 | } 42 | 43 | public void setId(Long id) { 44 | this.id = id; 45 | } 46 | 47 | public String getTexto() { 48 | return texto; 49 | } 50 | 51 | public void setTexto(String texto) { 52 | this.texto = texto; 53 | } 54 | 55 | public String getUsuario() { 56 | return usuario; 57 | } 58 | 59 | public void setUsuario(String usuario) { 60 | this.usuario = usuario; 61 | } 62 | 63 | public Date getData() { 64 | return data; 65 | } 66 | 67 | public void setData(Date data) { 68 | this.data = data; 69 | } 70 | 71 | public Livro getLivro() { 72 | return livro; 73 | } 74 | 75 | public void setLivro(Livro livro) { 76 | this.livro = livro; 77 | } 78 | 79 | } 80 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/resources/AutoresResource.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.net.URI; 4 | import java.util.List; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.http.HttpStatus; 8 | import org.springframework.http.ResponseEntity; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RequestMethod; 13 | import org.springframework.web.bind.annotation.RestController; 14 | import org.springframework.web.servlet.support.ServletUriComponentsBuilder; 15 | 16 | import com.algaworks.socialbooks.domain.Autor; 17 | import com.algaworks.socialbooks.services.AutoresService; 18 | 19 | @RestController 20 | @RequestMapping("/autores") 21 | public class AutoresResource { 22 | 23 | @Autowired 24 | private AutoresService autoresService; 25 | 26 | @RequestMapping(method = RequestMethod.GET) 27 | public ResponseEntity> listar() { 28 | List autores = autoresService.listar(); 29 | return ResponseEntity.status(HttpStatus.OK).body(autores); 30 | } 31 | 32 | @RequestMapping(method = RequestMethod.POST) 33 | public ResponseEntity salvar(@RequestBody Autor autor) { 34 | autor = autoresService.salvar(autor); 35 | 36 | URI uri = ServletUriComponentsBuilder.fromCurrentRequest() 37 | .path("/{id}").buildAndExpand(autor.getId()).toUri(); 38 | 39 | return ResponseEntity.created(uri).build(); 40 | } 41 | 42 | @RequestMapping(value = "/{id}", method = RequestMethod.GET) 43 | public ResponseEntity buscar(@PathVariable("id") Long id) { 44 | Autor autor = autoresService.buscar(id); 45 | return ResponseEntity.status(HttpStatus.OK).body(autor); 46 | } 47 | } -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | import com.algaworks.socialbooks.services.exceptions.AutorExistenteException; 11 | import com.algaworks.socialbooks.services.exceptions.AutorNaoEncontradoException; 12 | 13 | @Service 14 | public class AutoresService { 15 | 16 | @Autowired 17 | private AutoresRepository autoresRepository; 18 | 19 | public List listar() { 20 | return autoresRepository.findAll(); 21 | } 22 | 23 | public Autor salvar(Autor autor) { 24 | if(autor.getId() != null) { 25 | Autor a = autoresRepository.findOne(autor.getId()); 26 | 27 | if(a != null) { 28 | throw new AutorExistenteException("O autor já existe."); 29 | } 30 | } 31 | return autoresRepository.save(autor); 32 | } 33 | 34 | public Autor buscar(Long id) { 35 | Autor autor = autoresRepository.findOne(id); 36 | 37 | if(autor == null) { 38 | throw new AutorNaoEncontradoException("O autor não pôde ser encontrado."); 39 | } 40 | return autor; 41 | } 42 | } -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorExistenteException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorExistenteException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorExistenteException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorExistenteException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Testando nossos recursos e formatando nossas representações JSON/src/main/resources/application.properties -------------------------------------------------------------------------------- /Testando nossos recursos e formatando nossas representações JSON/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Tratamento correto das respostas HTTP 404 e 201/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Tratamento correto das respostas HTTP 404 e 201/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Tratamento correto das respostas HTTP 404 e 201/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Tratamento correto das respostas HTTP 404 e 201/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Tratamento correto das respostas HTTP 404 e 201/src/main/resources/application.properties -------------------------------------------------------------------------------- /Tratamento correto das respostas HTTP 404 e 201/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Utilizando a anotação @JsonInclude/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-test 35 | test 36 | 37 | 38 | 39 | 40 | 41 | 42 | org.springframework.boot 43 | spring-boot-maven-plugin 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Utilizando a anotação @JsonInclude/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Utilizando a anotação @JsonInclude/src/main/java/com/algaworks/socialbooks/domain/Comentario.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | 5 | public class Comentario { 6 | 7 | private Long id; 8 | 9 | private String texto; 10 | 11 | private String usuario; 12 | 13 | private Date data; 14 | 15 | public Long getId() { 16 | return id; 17 | } 18 | 19 | public void setId(Long id) { 20 | this.id = id; 21 | } 22 | 23 | public String getTexto() { 24 | return texto; 25 | } 26 | 27 | public void setTexto(String texto) { 28 | this.texto = texto; 29 | } 30 | 31 | public String getUsuario() { 32 | return usuario; 33 | } 34 | 35 | public void setUsuario(String usuario) { 36 | this.usuario = usuario; 37 | } 38 | 39 | public Date getData() { 40 | return data; 41 | } 42 | 43 | public void setData(Date data) { 44 | this.data = data; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /Utilizando a anotação @JsonInclude/src/main/java/com/algaworks/socialbooks/domain/Livro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | import com.fasterxml.jackson.annotation.JsonInclude; 7 | import com.fasterxml.jackson.annotation.JsonInclude.Include; 8 | 9 | public class Livro { 10 | 11 | @JsonInclude(Include.NON_NULL) 12 | private Long id; 13 | 14 | private String nome; 15 | 16 | @JsonInclude(Include.NON_NULL) 17 | private Date publicacao; 18 | 19 | @JsonInclude(Include.NON_NULL) 20 | private String editora; 21 | 22 | @JsonInclude(Include.NON_NULL) 23 | private String resumo; 24 | 25 | @JsonInclude(Include.NON_NULL) 26 | private List comentarios; 27 | 28 | @JsonInclude(Include.NON_NULL) 29 | private String autor; 30 | 31 | public Livro() {} 32 | 33 | public Livro(String nome) { 34 | this.nome = nome; 35 | } 36 | 37 | public Long getId() { 38 | return id; 39 | } 40 | 41 | public void setId(Long id) { 42 | this.id = id; 43 | } 44 | 45 | public String getNome() { 46 | return nome; 47 | } 48 | 49 | public void setNome(String nome) { 50 | this.nome = nome; 51 | } 52 | 53 | public Date getPublicacao() { 54 | return publicacao; 55 | } 56 | 57 | public void setPublicacao(Date publicacao) { 58 | this.publicacao = publicacao; 59 | } 60 | 61 | public String getEditora() { 62 | return editora; 63 | } 64 | 65 | public void setEditora(String editora) { 66 | this.editora = editora; 67 | } 68 | 69 | public String getResumo() { 70 | return resumo; 71 | } 72 | 73 | public void setResumo(String resumo) { 74 | this.resumo = resumo; 75 | } 76 | 77 | public List getComentarios() { 78 | return comentarios; 79 | } 80 | 81 | public void setComentarios(List comentarios) { 82 | this.comentarios = comentarios; 83 | } 84 | 85 | public String getAutor() { 86 | return autor; 87 | } 88 | 89 | public void setAutor(String autor) { 90 | this.autor = autor; 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /Utilizando a anotação @JsonInclude/src/main/java/com/algaworks/socialbooks/resources/LivrosResources.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RequestMethod; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | import com.algaworks.socialbooks.domain.Livro; 11 | 12 | @RestController 13 | public class LivrosResources { 14 | 15 | @RequestMapping(value = "/livros", method = RequestMethod.GET) 16 | public List listar() { 17 | 18 | Livro l1 = new Livro("Rest Aplicado"); 19 | Livro l2 = new Livro("Git passo-a-passo"); 20 | 21 | Livro[] livros = {l1, l2}; 22 | 23 | return Arrays.asList(livros); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Utilizando a anotação @JsonInclude/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Utilizando a anotação @JsonInclude/src/main/resources/application.properties -------------------------------------------------------------------------------- /Utilizando a anotação @JsonInclude/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.algaworks.socialbooks 7 | socialbooks 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | socialbooksapi 12 | API Social para Livros 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.3.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | 1.8 24 | 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-data-jpa 39 | 40 | 41 | com.h2database 42 | h2 43 | runtime 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-devtools 48 | 49 | 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-maven-plugin 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/SocialbooksApplication.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SocialbooksApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(SocialbooksApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/domain/DetalhesErro.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.domain; 2 | 3 | public class DetalhesErro { 4 | 5 | private String titulo; 6 | 7 | private Long status; 8 | 9 | private Long timestamp; 10 | 11 | private String mensagemDesenvolvedor; 12 | 13 | public String getTitulo() { 14 | return titulo; 15 | } 16 | 17 | public void setTitulo(String titulo) { 18 | this.titulo = titulo; 19 | } 20 | 21 | public Long getStatus() { 22 | return status; 23 | } 24 | 25 | public void setStatus(Long status) { 26 | this.status = status; 27 | } 28 | 29 | public Long getTimestamp() { 30 | return timestamp; 31 | } 32 | 33 | public void setTimestamp(Long timestamp) { 34 | this.timestamp = timestamp; 35 | } 36 | 37 | public String getMensagemDesenvolvedor() { 38 | return mensagemDesenvolvedor; 39 | } 40 | 41 | public void setMensagemDesenvolvedor(String mensagemDesenvolvedor) { 42 | this.mensagemDesenvolvedor = mensagemDesenvolvedor; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/repository/AutoresRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Autor; 6 | 7 | public interface AutoresRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/repository/ComentariosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Comentario; 6 | 7 | public interface ComentariosRepository extends JpaRepository { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/repository/LivrosRepository.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.algaworks.socialbooks.domain.Livro; 6 | 7 | public interface LivrosRepository extends JpaRepository{ 8 | 9 | } 10 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/resources/AutoresResource.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.resources; 2 | 3 | import java.net.URI; 4 | import java.util.List; 5 | 6 | import javax.validation.Valid; 7 | 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.http.HttpStatus; 10 | import org.springframework.http.ResponseEntity; 11 | import org.springframework.web.bind.annotation.PathVariable; 12 | import org.springframework.web.bind.annotation.RequestBody; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RequestMethod; 15 | import org.springframework.web.bind.annotation.RestController; 16 | import org.springframework.web.servlet.support.ServletUriComponentsBuilder; 17 | 18 | import com.algaworks.socialbooks.domain.Autor; 19 | import com.algaworks.socialbooks.services.AutoresService; 20 | 21 | @RestController 22 | @RequestMapping("/autores") 23 | public class AutoresResource { 24 | 25 | @Autowired 26 | private AutoresService autoresService; 27 | 28 | @RequestMapping(method = RequestMethod.GET) 29 | public ResponseEntity> listar() { 30 | List autores = autoresService.listar(); 31 | return ResponseEntity.status(HttpStatus.OK).body(autores); 32 | } 33 | 34 | @RequestMapping(method = RequestMethod.POST) 35 | public ResponseEntity salvar(@Valid @RequestBody Autor autor) { 36 | autor = autoresService.salvar(autor); 37 | 38 | URI uri = ServletUriComponentsBuilder.fromCurrentRequest() 39 | .path("/{id}").buildAndExpand(autor.getId()).toUri(); 40 | 41 | return ResponseEntity.created(uri).build(); 42 | } 43 | 44 | @RequestMapping(value = "/{id}", method = RequestMethod.GET) 45 | public ResponseEntity buscar(@PathVariable("id") Long id) { 46 | Autor autor = autoresService.buscar(id); 47 | return ResponseEntity.status(HttpStatus.OK).body(autor); 48 | } 49 | } -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/services/AutoresService.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.algaworks.socialbooks.domain.Autor; 9 | import com.algaworks.socialbooks.repository.AutoresRepository; 10 | import com.algaworks.socialbooks.services.exceptions.AutorExistenteException; 11 | import com.algaworks.socialbooks.services.exceptions.AutorNaoEncontradoException; 12 | 13 | @Service 14 | public class AutoresService { 15 | 16 | @Autowired 17 | private AutoresRepository autoresRepository; 18 | 19 | public List listar() { 20 | return autoresRepository.findAll(); 21 | } 22 | 23 | public Autor salvar(Autor autor) { 24 | if(autor.getId() != null) { 25 | Autor a = autoresRepository.findOne(autor.getId()); 26 | 27 | if(a != null) { 28 | throw new AutorExistenteException("O autor já existe."); 29 | } 30 | } 31 | return autoresRepository.save(autor); 32 | } 33 | 34 | public Autor buscar(Long id) { 35 | Autor autor = autoresRepository.findOne(id); 36 | 37 | if(autor == null) { 38 | throw new AutorNaoEncontradoException("O autor não pôde ser encontrado."); 39 | } 40 | return autor; 41 | } 42 | } -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorExistenteException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorExistenteException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorExistenteException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorExistenteException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/services/exceptions/AutorNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class AutorNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public AutorNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public AutorNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/java/com/algaworks/socialbooks/services/exceptions/LivroNaoEncontradoException.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks.services.exceptions; 2 | 3 | public class LivroNaoEncontradoException extends RuntimeException { 4 | 5 | /** 6 | * 7 | */ 8 | private static final long serialVersionUID = 1869300553614629710L; 9 | 10 | public LivroNaoEncontradoException(String mensagem) { 11 | super(mensagem); 12 | } 13 | 14 | public LivroNaoEncontradoException(String mensagem, Throwable causa) { 15 | super(mensagem, causa); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algaworks/workshop-rest-spring/9704e833b76f4710c2b192c58442a376f24b7272/Validando as entradas na nossa API/src/main/resources/application.properties -------------------------------------------------------------------------------- /Validando as entradas na nossa API/src/test/java/com/algaworks/socialbooks/SocialbooksApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.algaworks.socialbooks; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.test.context.web.WebAppConfiguration; 6 | import org.springframework.boot.test.SpringApplicationConfiguration; 7 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 | 9 | @RunWith(SpringJUnit4ClassRunner.class) 10 | @SpringApplicationConfiguration(classes = SocialbooksApplication.class) 11 | @WebAppConfiguration 12 | public class SocialbooksApplicationTests { 13 | 14 | @Test 15 | public void contextLoads() { 16 | } 17 | 18 | } 19 | --------------------------------------------------------------------------------