Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
13
respostas

Mostrando os pedidos do usuário# Estou tendo o seguintes erros#Ainda sem soluçao

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pedidoRepository' defined in br.com.alura.mvc.mudi.repository.PedidoRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.alura.mvc.mudi.model.Pedido.user references an unknown entity: org.springframework.security.core.userdetails.User

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.alura.mvc.mudi.model.Pedido.user references an unknown entity: org.springframework.security.core.userdetails.User

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.alura.mvc.mudi.model.Pedido.user references an unknown entity: org.springframework.security.core.userdetails.User

13 respostas
solução!

Olá Leobaldo! Tudo bem?

Parece que você está tendo algum problema relacionado com o mapeamento das entidades, com o @OneToOne e @ManyToOne. Consegue me enviar seu código pra eu dar uma olhada?

Caso o projeto seja de algum curso, também peço que sinalize, pra eu conseguir te ajudar melhor.

Fico aguardando!

package br.com.alura.mvc.mudi.controller; import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping;

import br.com.alura.mvc.mudi.dto.RequisicaoNovoPedido; import br.com.alura.mvc.mudi.model.Pedido; import br.com.alura.mvc.mudi.repository.PedidoRepository; import br.com.alura.mvc.mudi.repository.UserRepository;

@Controller @RequestMapping("pedido") public class PedidoController {

@Autowired
private PedidoRepository pedidoRepository;

@Autowired
private UserRepository userRepository;

@GetMapping("formulario")
public String formulario(RequisicaoNovoPedido requisicao) {
    return "pedido/formulario";
}

@PostMapping("novo")
public String novo(@Valid RequisicaoNovoPedido requisicao, BindingResult result) {
    if(result.hasErrors()) {
        return "pedido/formulario";
    }

    String username = SecurityContextHolder.getContext().getAuthentication().getName();

    User usuario = userRepository.findByUsername(username);
    Pedido pedido = requisicao.toPedido();
    pedido.setUser(usuario);
    pedidoRepository.save(pedido);
    return "redirect:/home";
}

}

package br.com.alura.mvc.mudi.model;

import java.math.BigDecimal; import org.springframework.security.core.userdetails.User; import java.time.LocalDate;

import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne;

@Entity public class Pedido {

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String nomeProduto;
private BigDecimal valorNegociado;
private LocalDate dataDaEntrega;
private String urlProduto;
private String urlImagem;
private String descricao;

@Enumerated(EnumType.STRING)
private StatusPedido status;

@ManyToOne(fetch = FetchType.LAZY)
private User user;

public String getNomeProduto() {
    return nomeProduto;
}
public void setNomeProduto(String nomeProduto) {
    this.nomeProduto = nomeProduto;
}
public BigDecimal getValorNegociado() {
    return valorNegociado;
}
public void setValorNegociado(BigDecimal valorNegociado) {
    this.valorNegociado = valorNegociado;
}
public LocalDate getDataDaEntrega() {
    return dataDaEntrega;
}
public void setDataDaEntrega(LocalDate dataDaEntrega) {
    this.dataDaEntrega = dataDaEntrega;
}
public String getUrlProduto() {
    return urlProduto;
}
public void setUrlProduto(String urlProduto) {
    this.urlProduto = urlProduto;
}
public String getUrlImagem() {
    return urlImagem;
}
public void setUrlImagem(String urlImagem) {
    this.urlImagem = urlImagem;
}
public String getDescricao() {
    return descricao;
}
public void setDescricao(String descricao) {
    this.descricao = descricao;
}
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
public StatusPedido getStatus() {
    return status;
}
public void setStatus(StatusPedido status) {
    this.status = status;
}
public User getUser() {
    return user;
}
public void setUser(User user) {
    this.user = user;
}

}

package br.com.alura.mvc.mudi.model;

import javax.persistence.*; import java.util.List;

@Entity @Table(name = "users") public class User {

@Id
private String username;
private String password;
private Boolean enabled;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY)
private List<Pedido> pedidos;

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public Boolean getEnabled() {
    return enabled;
}
public void setEnabled(Boolean enabled) {
    this.enabled = enabled;
}

}

package br.com.alura.mvc.mudi.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;

import br.com.alura.mvc.mudi.model.Pedido; import br.com.alura.mvc.mudi.model.StatusPedido;

@Repository public interface PedidoRepository extends JpaRepository<Pedido, Long> {

List<Pedido> findByStatus(StatusPedido status);
@Query("select p from Pedido p join p.user u where u.username = :username")
List<Pedido> findAllByUsuario(@Param("username")String username);

}

package br.com.alura.mvc.mudi.repository;

import br.com.alura.mvc.mudi.model.Pedido; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;

import br.com.alura.mvc.mudi.model.User;

import java.util.List;

@Repository public interface UserRepository extends JpaRepository<User, String>{

User findByUsername(String username);

}

package br.com.alura.mvc.mudi.repository;

import br.com.alura.mvc.mudi.model.Pedido; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;

import br.com.alura.mvc.mudi.model.User;

import java.util.List;

@Repository public interface UserRepository extends JpaRepository<User, String>{

User findByUsername(String username);

}

package br.com.alura.mvc.mudi.ConfigurationUrl;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager;

import javax.sql.DataSource;

import static org.springframework.security.core.userdetails.User.withDefaultPasswordEncoder;

@Configuration @EnableWebSecurity

public class WebSecurityconfig extends WebSecurityConfigurerAdapter {

@Autowired
private DataSource dataSource;

@Override
protected void configure(HttpSecurity http) throws Exception{
   http.authorizeRequests()
           .anyRequest().authenticated()
           .and()
           .formLogin(form -> form
                   .loginPage("/login")
                   .defaultSuccessUrl("/home", true)
                   .permitAll())
           .logout(sair -> sair.logoutUrl("/sair"))
           .csrf().disable();

} @Override protected void configure (AuthenticationManagerBuilder auth) throws Exception{ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

      // UserDetails user =
               //User.builder()
               //.username("bebezao")
               //.password(encoder.encode("bebezao"))
               //.roles("ADM")
               //.build();

 auth.jdbcAuthentication()
         .dataSource(dataSource)
         .passwordEncoder(encoder);
         //.withUser(user);

} }

Curso de Spring MVC: autenticação com Spring Security, API Rest e AJAX

ainda não conseguir reolver o problema ..

Oi Leobaldo!

Na sua classe Pedido, você está importando uma classe User direto do Spring, com esse import: import org.springframework.security.core.userdetails.User. Porém, para que seu relacionamento seja corretamente configurado, você precisa importar a classe do seu projeto, que você configurou.

Tenta apagar o import e ver se a IDE te ajuda, mostrando a classe correta, no pacote criado por você.

Espero ter ajudado, abraços e bons estudos!

olá eu apaguei porem o erro persiste .. na ide ele aponta para um erro na em pedidocontrolle Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Agora você precisa clicar onde está com erro e ver quais imports a IDE te sugere. Feito isso, você irá selecionar o import da classe que você mesmo criou. Assim, o relacionamento vai ser configurado corretamente.

Se não encontrar, tenta utilizar lá em cima na classe o seguinte import: import br.com.alura.mvc.mudi.model.User. Dessa forma, você está adicionando o import manualmente.