代码之家  ›  专栏  ›  技术社区  ›  Halil

Spring MVC-有条件返回html内容或模板内容

  •  2
  • Halil  · 技术社区  · 6 年前

    当支付交易成功完成时,我想返回HTML内容(由外部服务提供)。

    如果付款交易失败,我想返回到付款表单(这是一个thymeleaf模板)。

    我如何实现这种有条件的行为?

    @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 回复  |  直到 6 年前
        1
  •  1
  •   Halil    6 年前

    为了解决这个问题,我首先开发了一个新的视图接口实现。此实现将用于将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对象中使用模板的名称。