метод удаления не работает в Spring Boot & Thymeleaf - PullRequest
0 голосов
/ 27 ноября 2018

Я создаю простое приложение в Spring Boot.У меня проблема с моим методом delete.

Я создаю UserController следующим образом: @Controller public class UserController {

@Autowired
UserRepository userRepository;

@RequestMapping(value = "/students", method = RequestMethod.GET)
public String tables(Model model){
    model.addAttribute("users", userRepository.findAll());
    return "students";
}


@RequestMapping(value = "/delete/{id}", method = GET)
public String delete(Model model, @PathVariable("id") Long id){
    User user = userRepository.findById(id)
        .orElseThrow(() -> new IllegalArgumentException("Niepoprawne id : " + id));
    userRepository.deleteUserById(id);
    model.addAttribute("students", userRepository.findAll());
    return "redirect:/students";
}}

В моем UserPrepository у меня есть этот метод:

@Repository
public interface UserRepository extends JpaRepository<User,Long> {
    User findByEmail(String email);
    List<User> findAll();
   void deleteUserById(Long id);

}

UserService:

@Service
public interface UserService extends UserDetailsService {

    User findByEmail(String email);
    User save(UserRegistrationDto registration);
    List<User> findAll();
    void deleteUserById(Long id);

}

И UserServiceImpl:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RoleRepository roleRepository;

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;


    public User findByEmail(String email){
        return userRepository.findByEmail(email);
    }


    private Collection<? extends GrantedAuthority> mapRolesToAuthorities(Collection<Role> roles){
        return roles.stream()
            .map(role -> new SimpleGrantedAuthority(role.getName()))
            .collect(Collectors.toList());
    }

    public List<User> findAll(){
       return userRepository.findAll();
    }


    public void deleteUserById(Long id) {
        userRepository.deleteUserById(id);
    }
}

Во внешнем интерфейсе я создаю простую таблицу, подобную этой:

<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0" >
                            <thead>
                            <tr>
                                <th>IMIE</th>
                                <th>NAZWISKO</th>
                                <th>EMAIL</th>
                                <th>AKCJA</th>
                            </tr>
                            </thead>
                            <tbody>
                            <tr>
                            <tr th:each="user :${users}">
                                <td th:text="${user.firstName}"></td>
                                <td th:text="${user.lastName}"></td>
                                <td th:text="${user.email}"></td>
                                <td>
                                    <!--<a th:href="${'/students/delete/' + user.id}" class="btn btn-danger">Usuń</a>-->
                                <td><a th:href="@{/delete/{id}(id=${user.id})}">Delete</a></td>
                                </td>
                            </tr>
                            </tr>
                            </tbody>
                        </table>

Теперь, когда я начинаюмое приложение и нажмите кнопку «Удалить». У меня есть ошибка на веб-сайте: нет EntityManager с фактической транзакцией, доступной для текущего потока - невозможно надежно обработать вызов «удалить»;Вложенное исключение - javax.persistence.TransactionRequiredException: Нет EntityManager с фактической транзакцией, доступной для текущего потока - не может надежно обработать вызов 'remove'

Что не мое?Как это исправить?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Или вы можете заменить deleteUserById методом по умолчанию CrudRepository void deleteById(ID id), который удалит объект с заданным идентификатором.

0 голосов
/ 27 ноября 2018

Только методы CRUD (методы CrudRepository) по умолчанию помечены как транзакционные.Если вы используете пользовательские методы запроса, вы должны явно пометить его аннотацией @Transactional.

, поэтому поместите @Transactional в метод deleteUserById в класс хранилища, как показано ниже.

@Transactional
void deleteUserById(Long id);

См. это

...