Как аннотировать проверку существования пользователя с помощью Spring? - PullRequest
1 голос
/ 06 марта 2012

Я хочу управлять пользовательскими проектами через JSON API, и я хотел бы использовать контроллер относительного пути.Вот так:

@RequestMapping(value="/users/{userId}/projects",
    headers="Accept=application/json")
@Controller
public class UserProjectsController {

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(method=RequestMethod.GET)
    public @ResponseBody Object getAllUserProjects(@PathVariable String userId) {
        User user = userRepository.findById(userId);
        if (user == null) {
            return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
        }
        return user.getGivenProjects();
    }
}

Я добавлю множество методов и каждый раз буду проверять, существует ли пользователь.Вместо добавления этого фрагмента кода:

User user = userRepository.findById(userId);
if (user == null) {
    return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
}

... при запуске каждого метода, я хотел бы создать пользовательскую аннотацию, которая будет возвращать 404, если пользователь не существует.

Я нашел этот урок , чтобы сделать это.Это действительно так сложно, как описано?Знаете ли вы другое решение?(Я хотел бы избежать написания 2 классов и более 50 строк кода только для аннотирования 4 строк.)

Спасибо.

1 Ответ

3 голосов
/ 06 марта 2012

Сначала я предполагаю, что эта проверка не имеет ничего общего с безопасностью, не так ли?

Я думаю, WebArgumentResolver не будет соответствовать вашим потребностям. Возвращение статуса 404 может быть сложным.

Может быть, пользовательский перехватчик может быть лучшим решением. Он будет вызываться в каждом запросе к вашим контроллерам. Там вы можете проверить объект-обработчик, чтобы увидеть, например, имеет ли он параметр с именем userId , помеченный @ PathVariable . Затем вы можете выполнить проверку и использовать объект ответа для возврата 404, если это необходимо.

Другой вариант - создать пользовательский @ Aspect , но, возможно, мы слишком усложняем проблему. Итак, сначала попробуйте предыдущее решение.

...