Перенаправление с контроллера Spring REST с параметрами

У меня есть два разных приложения Spring (app-one, app-two), app-one должно получить ответ, а затем перенаправить в приложение-два с некоторыми параметрами. Итак, у меня в app-one есть следующий контроллер REST:

@RestController
public class RedirectController
{
    @GetMapping(value = "/redirect")
    public ResponseEntity<Void> redirectEndpoint(HttpServletRequest request, 
        RedirectAttributes redirectAttributes)
    {
        // Do some business logic

        // Set parameters
        redirectAttributes.addAttribute("attribute", "Value 1");
        redirectAttributes.addFlashAttribute("flashAttribute", "Value 2");

        // Redirect to success URL
        String redirectURL = "http://app-two/success";
        HttpHeaders headers = new HttpHeaders();
        headers.setLocation(URI.create(redirectURL));
        return ResponseEntity.status(HttpStatus.FOUND).headers(headers).build();
    }
}

И следующий контроллер REST в app-two:

@RestController
public class SuccessController
{
    @GetMapping(value = "/success")
    public ResponseEntity<Void> successEndpoint(HttpServletRequest request, Model model,
        @RequestParam(value = "attribute", required = false) String attribute,
        @ModelAttribute(value = "flashAttribute") String flashAttribute)
    {
        // Get parameters
        System.out.println("attribute: " + attribute);
        System.out.println("flashAttribute: " + flashAttribute);

        String flashAttributeFromModelMap = (String) model.asMap().get("flashAttribute");
        System.out.println("flashAttributeFromModelMap: " + flashAttributeFromModelMap);

        Map<String, ?> flashMap = RequestContextUtils.getInputFlashMap(request);
        if (flashMap != null)
        {
            String flashAttributeFromFlashMap = (String) flashMap.get("flashAttribute");
            System.out.println("flashAttributeFromFlashMap: " + flashAttributeFromFlashMap);
        }

        // Do some business logic

        return ResponseEntity.status(HttpStatus.OK).build();
    }
}

Мне удалось успешно перенаправить, вернув FOUND (302). Но при добавлении атрибутов к RedirectAttributes (в данном случае attribute и flashAttribute) эти атрибуты не обнаруживаются после выполнения перенаправления (attribute получает null, а flashAttribute получает empty).

Я пытался получить значения атрибутов разными способами (@RequestParam, @ModelAttribute, model.asMap().get() и RequestContextUtils.getInputFlashMap(request).get()), но ни один из них не получил правильного значения.

Мне нужно получить правильные значения атрибутов в successEndpoint. Любые предложения о том, как этого добиться?

Заранее спасибо.

Разве этот http://app-two/success не должен быть http://your_server:port_number/app-two/success

Nicholas K 11.09.2018 19:34

отладьте build() на ResponseEntity, чтобы увидеть, получает ли он атрибут в качестве параметра запроса в URI. Также я из того, что я читаю flashAttributes, данные хранятся в сеансе, поэтому они не будут присутствовать в app-two, поскольку это будет другая JVM.

Yogesh_D 11.09.2018 19:47

@NicholasK, нет, это не проблема, перенаправление выполнено успешно

knemr57 11.09.2018 20:43

@Yogesh_D, нет, он не получает attribute в качестве параметра запроса в URI, и на самом деле это проблема! Я думаю, что вы правы насчет flashAttribute, это другая JVM, и поэтому ее нет в app-two.

knemr57 11.09.2018 20:54

@ возможно, попробуйте другой способ перенаправления, см. @ stackoverflow.com/questions/43103809/…

Yogesh_D 11.09.2018 21:23

или просто добавьте параметр запроса самостоятельно.

Yogesh_D 11.09.2018 21:24

@Yogesh_D, я уже делаю это и вручную добавляю параметры запроса в redirectURL, но я считаю, что это не лучшее решение.

knemr57 11.09.2018 23:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
2 881
0

Другие вопросы по теме