{
"campo": null,
"erro": null
},
{
"campo": null,
"erro": null
}
package br.com.eliza.forumalura.config.validation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@RestControllerAdvice
public class ErroDeValidacaoHandler {
@Autowired
private MessageSource messageSouce;
@ResponseStatus (code = HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public List<ErroFormularioDto> handle(MethodArgumentNotValidException exception){
List<ErroFormularioDto> dto = new ArrayList<>();
List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
for (FieldError e : fieldErrors) {
String mensagem = messageSouce.getMessage(e, LocaleContextHolder.getLocale());
ErroFormularioDto erro = new ErroFormularioDto(e.getField(), mensagem);
dto.add(erro);
}
return dto;
}
}
package br.com.eliza.forumalura.controller;
import br.com.eliza.forumalura.controller.dto.response.TopicoDto;
import br.com.eliza.forumalura.controller.dto.request.TopicoForm;
import br.com.eliza.forumalura.model.Topico;
import br.com.eliza.forumalura.repository.CursoRepository;
import br.com.eliza.forumalura.services.TopicoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;
import javax.validation.Valid;
import java.net.URI;
import java.util.List;
@RestController
@RequestMapping (value = "/topicos")
public class TopicoController {
@Autowired
private TopicoService topicoService;
@Autowired
private CursoRepository cursoRepository;
@GetMapping
public List<TopicoDto> lista(String nomeCurso){
if (nomeCurso == null) {
List<Topico> topicos = topicoService.findAll();
return TopicoDto.converter(topicos);
}
else {
List<Topico> topicos = topicoService.findByCurso_Nome(nomeCurso);
return TopicoDto.converter(topicos);
}
}
/*código 201(created) devemos devolver a URI do recurso que acabou de ser criado.
ex.: URI endereco = new URI("http://localhost:8080/topicos");
Para evitar passar o endereço completo da URI (pois pode mudar futuramente), utilizamos
a classe URIBuilder, que já pega automaticamente o endereço do servidor
e só precisa passar o final da URI.
ex.: URI endereco = uriBuilder.path("/topicos").toUri();*/
@PostMapping
public ResponseEntity <TopicoDto> cadastrar (@RequestBody @Valid TopicoForm topicoForm, UriComponentsBuilder uriBuilder){
Topico topico = topicoForm.converter(cursoRepository);
topicoService.save(topico);
URI uri = uriBuilder.path("topicos/{id}").buildAndExpand(topico.getId()).toUri();
return ResponseEntity.created(uri).body(new TopicoDto(topico));
}
package br.com.eliza.forumalura.controller.dto.request;
import br.com.eliza.forumalura.model.Curso;
import br.com.eliza.forumalura.model.Topico;
import br.com.eliza.forumalura.repository.CursoRepository;
import com.sun.istack.NotNull;
import org.hibernate.validator.constraints.Length;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotEmpty;
public class TopicoForm {
@NotNull @NotEmpty @Length(min = 5)
private String titulo;
@NotNull @NotEmpty
private String mensagem;
@NotNull @NotEmpty
private String nomeCurso;
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getMensagem() {
return mensagem;
}
public void setMensagem(String mensagem) {
this.mensagem = mensagem;
}
public void setNomeCurso(String nomeCurso) {
this.nomeCurso = nomeCurso;
}
public String getNomeCurso() {
return nomeCurso;
}
public Topico converter(CursoRepository cursoRepository) {
Curso curso = cursoRepository.findByNome(nomeCurso);
return new Topico(titulo, mensagem, curso);
}
}
`