类型不匹配无法从类型Optional<User>转换为User

use*_*475 8 java java-8 option-type

我正在尝试创建一个允许用户更新、编辑、删除等的网站,并且我已经到达更新或编辑用户\xe2\x80\x99s信息的部分。我使用不同的方法多次尝试,但似乎无法克服该错误。我完全忘记了Optional<>我只是不明白\xe2\x80\x99t得到它。我已阅读https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html,但我不明白它应该如何编码,它只是不点击。如果有人可以告知如何在我的代码中对其进行编码并请解释它,我将非常感激。也许是因为我工作过度并且没有睡觉,但我似乎无法纠正这个错误。这是我尝试编辑用户信息时在页面上收到的错误:

\n\n

出现意外错误(类型=内部服务器错误,状态=500)。\n对于输入字符串:“id”\njava.lang.NumberFormatException:对于输入字符串:id

\n\n
    //Repository\n\n    public interface UserRepository extends CrudRepository<User, Integer> {\n     }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是用户服务

\n\n
    //UserService\n\n    @Service\n    @Transactional\n    public class UserService {\n\n        private final UserRepository userRepository;\n\n        public UserService(UserRepository userRepository) {\n            this.userRepository=userRepository;\n\n        }\n        public void saveMyUser(User user) {\n            userRepository.save(user);\n        }\n\n        public List<User> showAllUsers(){\n\n            List<User> users = new ArrayList<User>();\n            for(User user: userRepository.findAll()) {\n                users.add(user);\n            }\n\n            return users;\n        }\n\n        public void deleteMyUser(int id) {\n            userRepository.deleteById(id);\n\n        }\n\n        public User editUser (int id) {\n\n            return userRepository.findById(id);//I also get an error here as well\n        }\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是控制器

\n\n
    //Application Controller\n\n    @Controller\n    public class ApplicationController {\n\n        @Autowired\n        private UserService userService;\n\n        // THIS IS WHERE I GET THE ERROR\n\n        @RequestMapping("/edit-user")\n        public String editUser(@RequestParam int id,HttpServletRequest request) {\n\n            /* OPTIONAL<?> is this where i would implement the \n               optional what do i have to put here exactly? \n               I tried some ways I read about but its not working for me */\n\n            request.setAttribute("user", userService.editUser(id));\n            request.setAttribute("mode", "MODE_UPDATE");\n            return "welcome";\n        }\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

感谢您提前提供的帮助,我对此感到有点沮丧,因为我整晚都在尝试纠正这个错误。

\n

S.D*_*eko 14

有多种方法可以将选项转换为实体。您可以使用以下内容:

使用 get() 方法:

 public User editUser (int id) {
      return userRepository.findById(id).get();
 }
Run Code Online (Sandbox Code Playgroud)

使用 orElse 方法:

public User editUser (int id) {
    /* new User() is stab if user was not found */
    return userRepository.findById(id).orElse(new User());
}
Run Code Online (Sandbox Code Playgroud)

使用 orElseThrow 方法:

public User editUser (int id) {
        /* Throw exception if user was not found*/
        return userRepository.findById(id).orElseThrow(IllegalArgumentException::new));
    }
Run Code Online (Sandbox Code Playgroud)

至于控制器,它将是这样的:

        @RequestMapping("/edit-user")
        public String editUser(@RequestParam int id,HttpServletRequest request) {

            User user = userService.editUser(id);

            request.setAttribute("user", user);
            request.setAttribute("mode", "MODE_UPDATE");
            return "welcome";
        }
Run Code Online (Sandbox Code Playgroud)

您的主题也有类似的问题:

春季启动。如何将Optional<>传递给实体类