Spring MVC - условно вернуть HTML-контент или шаблонное содержимое - PullRequest
0 голосов
/ 16 мая 2018

Я хочу вернуть HTML-контент (предоставленный внешней службой), когда платежная транзакция успешно завершена.

Если платежная транзакция не удалась, я хочу вернуться к платежной форме (которая является шаблоном тимиана).

Как мне реализовать это условное поведение?

@PostMapping(value =  "/payment3ds/{offerId}/{company}")
public String payment3dsPost(
                             @PathVariable(value = "offerId") String offerId,
                             @PathVariable(value="company") String companyName,
                             @ModelAttribute("startSubscriptionRequest") StartSubscriptionRequest formInput, Model model) {

    try {
        String htmlContent = endpointsNoAuth.startSubscription3ds(formInput);

        return htmlContent; // value: "<html><body>...</body><html>
    } catch (IllegalArgumentException e) {
        Offer plan = subscriptionPlanRepo.findOneByIdAndCompanyName(Long.valueOf(offerId), companyName);
        model.addAttribute("subscriptionPlan", plan);
        model.addAttribute("errorText", e.getMessage());

        return "payment3ds"; // thymeleaf template
    }
}

1 Ответ

0 голосов
/ 19 мая 2018

Чтобы решить эту проблему, сначала я разработал новую реализацию интерфейса View.Эта реализация будет использоваться для возврата HTML-кода клиенту:

public class HtmlView implements View {
    private String src;

    public HtmlView(String htmlContent) {
        this.src = htmlContent;
    }

    @Override
    public String getContentType() {
        return MediaType.TEXT_HTML_VALUE;
    }

    @Override
    public void render(Map<String, ?> map, HttpServletRequest httpServletRequest, HttpServletResponse response) throws Exception {
        response.setContentType(getContentType());
        response.getWriter().append(src);
    }
}

Затем я обновил свой контроллер для возврата ModelAndView:

@PostMapping(value =  "/payment3ds/{offerId}/{company}")
public ModelAndView payment3dsPost(...) {

    try {
        String htmlContent = "<html></html>";
        View view = new HtmlView(htmlContent);
        modelAndView.setView(view);

        return modelAndView;
    } catch (IllegalArgumentException e) {
        Offer plan = subscriptionPlanRepo.findOneByIdAndCompanyName(Long.valueOf(offerId), companyName);
        Company company = companyRepo.findByName(companyName);

        // Add your data in model
        Map<String, Object> model = modelAndView.getModel();

        modelAndView.setViewName("payment3ds"); // thymeleaf template
        return modelAndView; 
    }
}

Если я хочу вернуть HTML-код, я используюHtmlView, в противном случае я использую имя шаблона в объекте ModelAndView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...