SpringMVC-有条件地返回html内容或模板内容

SpringMVC-有条件地返回html内容或模板内容,spring,spring-mvc,thymeleaf,Spring,Spring Mvc,Thymeleaf,当支付交易成功完成时,我想返回HTML内容(由外部服务提供) 如果付款交易失败,我想返回到付款表单(这是一个thymeleaf模板) 我如何实现这种有条件的行为 @PostMapping(value = "/payment3ds/{offerId}/{company}") public String payment3dsPost( @PathVariable(value = "offerId") String offerId,

当支付交易成功完成时,我想返回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
    }
}
@PostMapping(value=“/payment3ds/{offerId}/{company}”)
公共字符串付款3dspost(
@PathVariable(value=“offerId”)字符串offerId,
@PathVariable(value=“company”)字符串companyName,
@ModelAttribute(“startSubscriptionRequest”)startSubscriptionRequest(输入,模型){
试一试{
字符串htmlContent=endpointsNoAuth.startSubscription3ds(formInput);
返回htmlContent;//值:。。。
}捕获(IllegalArgumentException e){
报价计划=订阅计划repo.findonebyiandcompanyname(Long.valueOf(offerId),companyName);
model.addAttribute(“订阅计划”,计划);
addAttribute(“errorText”,例如getMessage());
返回“payment3ds”;//thymeleaf模板
}
}

为了解决这个问题,首先我开发了一个新的视图界面实现。这个实现将用于将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);
    }
}
公共类HtmlView实现视图{
私有字符串src;
公共HtmlView(字符串htmlContent){
this.src=htmlContent;
}
@凌驾
公共字符串getContentType(){
返回MediaType.TEXT\u HTML\u值;
}
@凌驾
公共void呈现(映射映射、HttpServletRequest、HttpServletRequest、HttpServletResponse)引发异常{
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; 
    }
}
@PostMapping(value=“/payment3ds/{offerId}/{company}”)
公共模型和查看付款3dspost(…){
试一试{
字符串htmlContent=“”;
视图=新的HtmlView(htmlContent);
modelAndView.setView(视图);
返回模型和视图;
}捕获(IllegalArgumentException e){
报价计划=订阅计划repo.findonebyiandcompanyname(Long.valueOf(offerId),companyName);
Company Company=companyRepo.findByName(companyName);
//在模型中添加数据
Map model=modelAndView.getModel();
modelAndView.setViewName(“payment3ds”);///thymeleaf模板
返回模型和视图;
}
}
如果我想返回HTML代码,我使用HtmlView,否则我使用ModelAndView对象中的模板名称