NullPointerException: null Spring

Odpowiedz Nowy wątek
2019-08-26 18:20
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>
edytowany 2x, ostatnio: witu122, 2019-08-26 18:22

Pozostało 580 znaków

2019-08-26 18:25
1

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

edytowany 1x, ostatnio: AngryProgrammer, 2019-08-26 18:26

Pozostało 580 znaków

2019-08-26 18:26

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

edytowany 1x, ostatnio: kixe52, 2019-08-26 18:26

Pozostało 580 znaków

2019-08-26 18:28
0

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

Pozostało 580 znaków

2019-08-26 18:36
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 ;)

edytowany 2x, ostatnio: kixe52, 2019-08-26 18:37
za to .orElse(null) kompilator powinien usuwać plik z klasą jako forma kary. - Grzyboo 2019-08-26 19:19
O kurde XD - stivens 2019-08-26 19:21

Pozostało 580 znaków

2019-08-26 19:28
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


btw, czy @Table nie jest tu zbędne? - danek 2019-08-26 19:36
Im wiencej adnotacji tym lepij. Jak ktoś jedną przypadkiem skasuje to może inna zadziała. - jarekr000000 2019-08-26 20:18
xD, rozbawiło mnie to aż do zalogowania się ale true, java : ) - pedegie 2019-08-26 20:33
@jarekr000000: Oglądałeś Pingwiny z Madagaskaru? Tam taki jeden rzygający jest jak zostanie bez kontroli. Trochę jak adnotacjami. - PerlMonk 2019-08-26 20:39
@danek: Yup, w tym wypadku ona nic nie robi :P - Burdzi0 2019-08-26 20:39

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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