Решение использует Java и Spring rest API. Когда одна из моих конечных точек API выполняется с помощью вызова API, запрос передается обработчику. На данный момент я делаю инъекцию (@autowired) в объект HttpServletResponse через конструктор.
Я изо всех сил пытаюсь понять, почему я испытываю следующее поведение, при котором перенаправление не всегда работает.
В этом примере показан код ошибки.
@Controller
public class ConnectController {
private final IConnectHandler connectHandler;
@Lazy
@Autowired
public ConnectController(IConnectHandler handler) {
this.connectHandler = handler;
}
@GetMapping("/redirect")
public String redirectHandler() {
this.connectHandler.providerRedirect();
}
}
@Service
public class ConnectHandler implements IConnectHandler {
private final HttpServletResponse response;
@Lazy
@Autowired
public ConnectController(HttpServletResponse response) {
this.response = response;
}
@Override
public String redirectHandler() {
response.sendRedirect("http://somewhere.com");
}
}
В этом примере показан минимум, необходимый для правильной работы
@Controller
public class ConnectController {
private final IConnectHandler connectHandler;
@Lazy
@Autowired
public ConnectController(IConnectHandler handler) {
this.connectHandler = handler;
}
// Now inject here and it all starts working
@GetMapping("/redirect")
public String redirectHandler(HttpServletResponse response) {
this.connectHandler.providerRedirect();
}
}
@Service
public class ConnectHandler implements IConnectHandler {
private final HttpServletResponse response;
@Lazy
@Autowired
public ConnectController(HttpServletResponse response) {
this.response = response;
}
@Override
public String redirectHandler() {
response.sendRedirect("http://somewhere.com");
}
}
В конкретном методе, с которым я столкнулся в этом странном поведении, я выполняю перенаправление с помощью метода sendRedirect.
Моя проблема в том, что это кажется очень ненадежным и в большинстве случаев возвращает шаблон не найдена ошибка.
НО, если я внедряю HttpServletResponse в метод контроллера, все работает должным образом, даже если я не использую этот конкретный объект и продолжаю использовать тот, который вводится в обработчик.
Я довольно новичок в этой структуре, и я уверен, что это из-за моего ограниченного понимания, но если бы кто-то мог указать мне правильное направление и дать некоторое представление, я был бы благодарен