Spring загрузочное приложение с Redis кешем и Mysql - PullRequest
0 голосов
/ 09 января 2019

Я пытался разработать загрузочное приложение Spring для кеширования, используя кэш Redis. Мое приложение работает для всех методов, кроме метода обновления. Вот код, который я написал

@ RestController

@ RequestMapping (value = "users /")

открытый класс UserController {

@Autowired
UserService userService;

@Autowired
UserRepository userRepository;

private static final Logger log = LoggerFactory.getLogger(UserController.class);

@RequestMapping(value = "add/", method = RequestMethod.POST)
public void saveUser(@RequestBody User user){

    log.info("Saving User information to the database...");
    userService.saveUser(user);
}

@Cacheable(value = "user-get" , key = "#id")
@RequestMapping(value = "get/{id}/", method = RequestMethod.GET)
public User getUserById(@PathVariable Long id){

  return userService.getUserById(id);
}

@Cacheable(value = "user-get-all")
@RequestMapping(value = "get/all/", method = RequestMethod.GET)
public List<User> getAllUser(){

    return userService.getAllUsers();
}

@CacheEvict(value = "user-delete", key = "#id")
@RequestMapping(value = "delete/{id}", method = RequestMethod.DELETE)
public void deleteUser(@PathVariable Long id){

    userService.deleteUser(id);
}

@CachePut(value = "user-update", key = "#user.id")
@RequestMapping(value = "update/{id}/", method = RequestMethod.POST)
public User updateUser(@PathVariable Long id, @RequestBody User user){

    User newuser = new User();
    newuser = userRepository.findById(id).get();
    newuser.setUserName(user.getUserName());
    newuser.setAge(user.getAge());
    return userService.saveUser(newuser);
}

}

Помогите мне решить проблему

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

У меня была похожая проблема, оказалось, что при использовании CachePut для метода, который имеет несколько входных параметров (например, id и user в вашем случае). Генератор ключей по умолчанию затем использует оба аргумента для генерации ключа. Даже если вы укажете ключ = "# user.id", он не сможет выбрать это значение. Исправление заключается в использовании фигурных скобок вокруг ключа. В вашем случае key = "{# user.id}". Это потому, что если у вас более двух аргументов и вы хотите использовать некоторые из них для генерации ключей, вы можете указать их с разделением запятыми внутри скобок, например, когда вы инициализируете массив "{# param1.foo2, # param4.bar1, # param6. foo1 } "и т. д.

Попробуйте это:

    @CachePut(value = "user-update", key = "{#user.id}")
    @RequestMapping(value = "update/{id}/", method = RequestMethod.POST)
    public User updateUser(@PathVariable Long id, @RequestBody User user){

    User newuser = new User();
    newuser = userRepository.findById(id).get();
    newuser.setUserName(user.getUserName());
    newuser.setAge(user.getAge());
    return userService.saveUser(newuser);
}
0 голосов
/ 09 января 2019

Если я правильно помню, при использовании обновления метод должен PUT или PATCH. Почему вы использовали POST.

@CachePut(value = "user-update", key = "#user.id")
@RequestMapping(value = "update/{id}/", method = RequestMethod.PUT)
public User updateUser(@PathVariable Long id, @RequestBody User user){

    User newuser = new User();
    newuser = userRepository.findById(id).get();
    newuser.setUserName(user.getUserName());
    newuser.setAge(user.getAge());
    return userService.saveUser(newuser);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...