【问题标题】:the delete method does't work in Spring Boot&Thymeleaf删除方法在 Spring Boot&Thymeleaf 中不起作用
【发布时间】:2019-04-29 03:50:33
【问题描述】:

我在 Spring Boot 中创建了一个简单的应用程序。我的方法删除有问题。

我这样创建一个 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);

}

用户服务:

@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: No EntityManager with actual transaction available for current thread - 无法可靠地处理“删除”调用

什么不是我的?如何解决?

【问题讨论】:

    标签: java spring spring-boot thymeleaf crud


    【解决方案1】:

    默认情况下,只有 CRUD 方法(CrudRepository 方法)被标记为事务性的。如果您使用自定义查询方法,则应使用 @Transactional 注释显式标记它。

    所以将@Transactional 放在存储库类中的deleteUserById 方法上,如下所示。

    @Transactional
    void deleteUserById(Long id);
    

    参考this

    【讨论】:

      【解决方案2】:

      或者您可以将 deleteUserById 替换为 CrudRepository 的默认方法 void deleteById(ID id) 删除具有给定 id 的实体。

      【讨论】:

        猜你喜欢
        • 2017-06-21
        • 2020-11-05
        • 2014-07-04
        • 2015-04-26
        • 2017-02-28
        • 2018-06-03
        • 2021-06-24
        • 2020-08-05
        • 2019-10-29
        相关资源
        最近更新 更多