Подход 1: Использование ThreadLocal
Код: Выделить всё
public class UserContext {
private static final ThreadLocal userIdHolder = new ThreadLocal();
public static void setUserId(Long userId) {
userIdHolder.set(userId);
}
public static Long getUserId() {
return userIdHolder.get();
}
public static void clear() {
userIdHolder.remove();
}
}
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
Long userId = // get userId from token or somewhere
UserContext.setUserId(userId);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
UserContext.clear();
}
}
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/info")
public String getUserInfo() {
return userService.getUserInfo();
}
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public String getUserInfo() {
Long userId = UserContext.getUserId(); // Can access userId directly
return userRepository.findUserInfo(userId);
}
}
Код: Выделить всё
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
Long userId = // get userId from token or somewhere
request.setAttribute("userId", userId);
return true;
}
}
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/info")
public String getUserInfo(@RequestAttribute("userId") Long userId) {
return userService.getUserInfo(userId);
}
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public String getUserInfo(Long userId) { // Need to pass userId as parameter
return userRepository.findUserInfo(userId);
}
}
Какой подход считается лучшим в приложении Spring? Меня особенно интересует:
- Что обычно выбирают опытные разработчики Spring?
- Существует ли официальная рекомендация Spring ?
- Есть ли конкретные сценарии, в которых один подход явно лучше другого?
Подробнее здесь: https://stackoverflow.com/questions/792 ... ication-la