7
respostas

Mesmo com a anotação @Transactional, vou no postman e não atualiza os dados

package br.com.alura.forum.controller.form;

import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Length;

import br.com.alura.forum.modelo.Topico; import br.com.alura.forum.repository.TopicoRepository;

public class AtualizarTopicoForm {

@NotNull
@NotEmpty
 @Length(min = 5)
private String titulo;

@NotNull
@NotEmpty
@Length(min = 10)
private String mensagem;

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 Topico Atualizar(Long id, TopicoRepository topicoRepository) {

    Topico topico = topicoRepository.getOne(id);
    topico.setTitulo(this.titulo);
    topico.setMensagem(this.mensagem);

    return topico;
}

}

7 respostas

Oi Caiury,

Posta aqui o seu codigo do controller para vermos qual pode ser o problema.

package br.com.alura.forum.controller;

import java.net.URI; import java.util.List;

import javax.transaction.Transactional; import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder;

import br.com.alura.forum.controller.dto.DetalhesDoTopicoDto; import br.com.alura.forum.controller.dto.TopicoDto; import br.com.alura.forum.controller.form.AtualizarTopicoForm; import br.com.alura.forum.controller.form.TopicoForm; import br.com.alura.forum.modelo.Topico; import br.com.alura.forum.repository.CursoRepository; import br.com.alura.forum.repository.TopicoRepository;

@RestController @RequestMapping("/topicos") public class TopicoController {

@Autowired
private TopicoRepository topicoRepository;
@Autowired
private CursoRepository cursoRepository;

@GetMapping
public List<TopicoDto> topicos(String nomeCurso) {
    if (nomeCurso == null) {
        List<Topico> topicos = topicoRepository.findAll();

        return TopicoDto.converter(topicos);
    } else {
        List<Topico> topicos = topicoRepository.findByCursoNome(nomeCurso);
        return TopicoDto.converter(topicos);
    }
}

@PostMapping
public ResponseEntity<TopicoDto> cadastrar(@RequestBody @Valid TopicoForm form, UriComponentsBuilder uriBuilder) {
    Topico topico = form.converter(cursoRepository);
    topicoRepository.save(topico);

    URI uri = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.getId()).toUri();

    return ResponseEntity.created(uri).body(new TopicoDto(topico));
}

@GetMapping("/{id}")
public DetalhesDoTopicoDto detalhar(@PathVariable Long id) {
    Topico topico = topicoRepository.getById(id);

    return new DetalhesDoTopicoDto(topico);
}


@PutMapping("/{id}")
@Transactional
ResponseEntity<TopicoDto>atualizar(@PathVariable Long id, @RequestBody @Valid AtualizarTopicoForm form){

Topico topico=form.Atualizar(id,topicoRepository);

return ResponseEntity.ok(new TopicoDto(topico));


}

}

O Controller está ok. Posta o codigo tambem da sua classe AtualizarTopicoForm

package br.com.alura.forum.controller.form;

import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Length;

import br.com.alura.forum.modelo.Topico; import br.com.alura.forum.repository.TopicoRepository;

public class AtualizarTopicoForm {

@NotNull
@NotEmpty
 @Length(min = 5)
private String titulo;

@NotNull
@NotEmpty
@Length(min = 10)
private String mensagem;

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 Topico Atualizar(Long id, TopicoRepository topicoRepository) {

    Topico topico = topicoRepository.getOne(id);
    topico.setTitulo(this.titulo);
    topico.setMensagem(this.mensagem);

    return topico;
}

}

Ta certinho também.

Verifiquei que você importou a anotação @Transactional do pacote do Java(javax.transaction.Transactional) mas na verdade deveria ser a anotação do pacote do Spring. Remova o import e importe novamente o do Spring e veja se resolve.

Não foi Professor kkkkkkkkk

Olá, tente usar este import

import org.springframework.transaction.annotation.Transactional;

pelo oque eu vi você está usando o transaction do próprio java, tente usar o do spring.