spring - Spring MVC - 有条件地返回 html 内容或模板内容
问题描述
当支付交易成功完成时,我想返回 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
}
}
解决方案
为了解决这个问题,我首先开发了一个 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 对象中的模板名称。
推荐阅读
- tensorflow - 如何批处理对象检测数据集?
- c - 为什么这个程序集会导致分段错误?
- python - 文本框未在 tkinter 中显示插入
- amazon-web-services - 如何指定 AWS CloudFront 访问日志的保留时间?
- python - 在基于另一列的列中执行加法计算(按特定列分组)
- python - Python yfinance HTTPError:HTTP 错误 404:未找到
- android - 增加 Android BLE 绑定/配对对话超时
- wordpress - Apache/2.4.46 (Win64) OpenSSL/1.1.1g PHP/7.4.11 服务器在 localhost 端口 80
- reactjs - 尝试将自定义元数据添加到 Firebase 存储和 Firestore
- python - 在决策树算法中将时间定义为分类变量