当付款交易成功完成时,我想要返回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
}
}
答案 0 :(得分:1)
要解决此问题,首先我开发了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对象中使用模板的名称。