Vamos a hacer una web API con Groovy, Spring boot y H2 (como dice el título)
Primero vamos a bajar nuestro proyecto de https://start.spring.io/ bien no sé como indicar lo que hay que seleccionar. Pero creo que es bastante fácil, groovy, h2, etc. Voy a utilizar maven y dejo el link al final del repositorio y pueden ver el pom.
Para comenzar vamos a hacer nuestras entidades :
@Entity
@Table(name = 'Demos')
class Demo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id
@Column
String unTexto
@Column
Boolean isUnCampoBool
@Column
LocalDate unaFecha
@OneToMany(cascade = CascadeType.ALL)
List<DemoItem> items = new ArrayList<>()
}
y
@Entity
@Table(name = 'DemoItems')
class DemoItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id
@Column
String unTexto
}
Luego el repositorio :
@Repository
interface DemoRepository extends JpaRepository<Demo, Integer> {}
Ahora el servicio con su implementación:
interface DemoService {
List<Demo> findAll()
Optional<Demo> findById(Integer todoId)
Demo insert(Demo demo)
Demo update(Demo demo)
Optional<Demo> delete(Integer id)
}
@Service
class DemoServiceImpl implements DemoService {
@Autowired
DemoRepository repository
@Override
List<Demo> findAll() {
return repository.findAll()
}
@Override
Optional<Demo> findById(Integer id) {
return repository.findById(id)
}
@Override
Demo insert(Demo demo) {
return repository.save(demo)
}
@Override
Demo update(Demo demo) {
return repository.save(demo)
}
@Override
Optional<Demo> delete(Integer id) {
Optional<Demo> demo = repository.findById(id)
if (demo.isPresent()) {
repository.delete(demo.get())
}
return demo
}
}
Y por ultimo el controller :
@RestController
@RequestMapping('demo')
class DemoController {
@Autowired
DemoService service
@GetMapping
List<Demo> findAll(){
service.findAll()
}
@PostMapping
Demo save(@RequestBody Demo demo){
service.insert(demo)
}
@PutMapping
Demo update(@RequestBody Demo demo){
service.update(demo)
}
@DeleteMapping('/{id}')
delete(@PathVariable Integer id){
Optional<Demo> demo = service.delete(id)
if (!demo.isPresent()) {
throw new NotFoundException<Demo>(id)
}
return demo.get()
}
@GetMapping('/{id}')
Demo getById(@PathVariable Integer id){
Optional<Demo> demo = service.findById(id)
if (!demo.isPresent()) {
throw new NotFoundException<Demo>(id)
}
return demo.get()
}
}
Y el controller lanza una excepción cuando no encuntra elementos que es esta :
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "not found")
class NotFoundException<T> extends RuntimeException {
private Long id
NotFoundException() {}
NotFoundException(Long id) {
this.id = id
}
@Override
String getMessage() {
return T + " not found"
}
}
Y listo!!!
Dejo el repositorio Github : https://github.com/emanuelpeg/GroovyWebAPI