Hej, mam pewien problem
Tworzę sobie popularną apke na taski w celu nauki, stworzyłem już rejestracje oraz logowanie z użyciem Spring Security, teraz po zalogowaniu chciałem aby użytkownik mógł sobie dodawać zadania, i problem polega na tym że tabela tasków wymaga id użytkownika który tego taska dodaje, lecz nie mam zielonego pojęcia skąd go pobrać, klasy wyglądają tak:
Klasa User:
package pl.saqie.FirstWebProject.domain.user;
import com.sun.istack.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import pl.saqie.FirstWebProject.domain.task.Task;
import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
@Entity
@Table(name = "user")
@Getter
@Setter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private String role;
private boolean locked = false;
private boolean enabled = true;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private Set<Task> tasks;
public User(String username, String password, String email, String role) {
this.username = username;
this.password = password;
this.email = email;
this.role = role;
}
public List<String> getRoles(){
if (this.role.length() > 0){
return Arrays.asList(this.role.split(","));
}
return new ArrayList<>();
}
}
Klasa Task:
package pl.saqie.FirstWebProject.domain.task;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import pl.saqie.FirstWebProject.domain.user.User;
import javax.persistence.*;
import java.time.LocalDateTime;
@Entity
@Table(name = "task")
@Getter
@Setter
@NoArgsConstructor
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String description;
private LocalDateTime createdDate;
private boolean done;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private User user;
public Task(String name, String description) {
this.name = name;
this.description = description;
this.createdDate = LocalDateTime.now();
this.done = false;
}
}
No i mam kontroler który przenosi mnie na stronę do tworzenia tasków (Po zalogowaniu oczywiście)
package pl.saqie.FirstWebProject.controllers.task;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import pl.saqie.FirstWebProject.domain.task.dto.TaskDto;
import pl.saqie.FirstWebProject.domain.task.service.TaskService;
import pl.saqie.FirstWebProject.domain.user.service.UserService;
import javax.validation.Valid;
@Controller
@AllArgsConstructor
@RequestMapping("/task")
public class TaskController {
private final TaskService taskService;
@GetMapping("/create")
public String getTaskCreateForm(Model model){
model.addAttribute(new TaskDto());
return "/view/task/create";
}
@PostMapping("/create")
public String createNewTask(@ModelAttribute @Valid TaskDto taskDto, BindingResult bindingResult){
if (bindingResult.hasErrors()){
return "/view/task/create";
}else {
taskService.createNewTask(taskDto);
return "redirect:/";
}
}
}
I tutaj pojawia się problem, używam thymeleaf i formularz wygląda tak:
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org" lang="pl"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head th:replace="fragments :: head"></head>
<body>
<div class="container">
<nav th:replace="fragments :: navigation"></nav>
</div>
<div class="container">
<div class="row justify-content-center" style="margin-top: 60px">
<h2 class="text-center text-warning">Dodawanie nowego taska</h2>
</div>
<div class="row justify-content-center" style="margin-top: 15px">
<div class="col-md-6">
<form th:action="@{/task/create}" th:method="post" th:object="${taskDto}">
<div class="align-content-center">
<input th:field="*{name}" class="form-control" type="text" placeholder="Nazwa"
aria-label="default input example">
<br>
<p th:errors="${taskDto.name}"></p>
<input th:field="*{description}" class="form-control" type="password" placeholder="Opis"
aria-label="default input example">
<p th:errors="${taskDto.description}"></p>
<br>
</div>
<div class="row justify-content-center">
<button type="submit" class="btn btn-warning">Dodaj nowego taska</button>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
jednakże po kliknięciu w buttona otrzymuje błąd który w sumie wiem z czego wynika bo sam ustaliłem że kolumna user_id nie może być nullem ale nie wiem skąd go pobrać w tym formularzu:
"Column 'user_id' cannot be null"
wygląd tabeli:
Z góry dziękuję za każdą pomoc.