NullPointerException: null Spring

0

Witam wszystkich,
pierwszy raz pojawił mi się problem podczas robienia CRUDa, gdy chce dodać Usera wyskakuje mi NullPointerException i nie mogę go za nić zlokalizować.
Gdy odpalam Debuggera i wysyłam fomularz to wskazuje mi ze UserService jest null
`

@Controller
@RequestMapping("/user")
public class UserController {


    private UserService userService;


    @GetMapping("/add")
    public String saveUser(Model model) {
User user=new User();
model.addAttribute("user",user);

        return "/client/add";
    }

    @PostMapping("/add")
    public String saveUser2(@Valid User user) {

        userService.save(user);
        return "/index";
    }


@Entity
@Table
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
private String password;
}
@Service
@Transactional
public class UserService {

    private UserRepository userRepository;

    public User save(User user) {
        return userRepository.save(user);
    }

    public User update(User user) {

        return userRepository.findById(user.getId()).map(userdb -> {
            if (user.getEmail() != null) {
                userdb.setEmail(user.getEmail());
            }
            return userRepository.save(userdb);
        }).orElse(null);

    }

    public void delete(long id){
        userRepository.deleteById(id);
    }

    public User findByUserId(long id){
        return userRepository.findById(id).orElse(new User());
    }
}
<body class="card text-center">



<form action="#" th:action="@{/user/add}" th:object="${user}" method="post">


    <div class="form-group">

            <input type="text" th:field="*{email}" />
            <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}">First Name
                Error</span>
    </div>
    <div class="form-group">

            <input type="text" th:field="*{password}" />
            <span th:if="${#fields.hasErrors('password')}" th:errors="*{password}">Last Name
                Error</span>
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-primary">ADD</button>
    </div>

</form>
</body>
1

W żaden sposób nie wstrzykujesz tego serwisu do controllera, ani repository do serwisu.

2

Skąd Controller ma wiedzieć jak wygląda instacja UserService ? Tak samo skąd UserService ma wiedzieć jak wygląda instancja UserRepository?

Poczytaj o Dependency Injection.
https://www.baeldung.com/constructor-injection-in-spring

0

Tak jest, macie rację. Stokrotne dzięki!

1
witu122 napisał(a):
public User update(User user) {

        return userRepository.findById(user.getId()).map(userdb -> {
            if (user.getEmail() != null) {
                userdb.setEmail(user.getEmail());
            }
            return userRepository.save(userdb);
        }).orElse(null);

    }

Jeszcze jedna sprawa - po to masz optionale aby nie zwracać nulli. Popraw to ;)
0
public class UserController {

    private UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

O ile masz ten UserService gdzieś w jakiejś formie zdefiniowany.

    public User findByUserId(long id){
        return userRepository.findById(id).orElse(new User());
    }

To nie powinno być wykonywane w transakcji.

@Entity
@Table
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User {

Użyj adnotacji @Data

1 użytkowników online, w tym zalogowanych: 0, gości: 1