gpt4 book ai didi

Spring TemplateEngine 处理错误 :field

转载 作者:行者123 更新时间:2023-12-02 09:02:43 24 4
gpt4 key购买 nike

我正在使用 spring 在 Java 中开发一个 Web 应用程序。

此应用程序包含 JavaScript 中的 Ajax 调用,该调用请求 html 代码,然后将其插入到 html 文档中。

为了将 thymeleaf 模板处理为字符串,我使用 TemplateEngine process(..) 方法。

当 thymeleaf 模板包含表单时,我遇到错误。

我的示例代码:

表单.html:

<form th:object="${customer}" xmlns:th="http://www.w3.org/1999/xhtml">
<label>Name</label>
<input type="text" th:field="*{name}" />
</form>

AjaxController.java:

package project;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

@Controller
public class AjaxController {

@Autowired
private TemplateEngine templateEngine;
private ObjectMapper objectMapper = new ObjectMapper();

@ResponseBody
@GetMapping(value="/form1")
public String form1() throws JsonProcessingException {

Customer customer = new Customer("Burger King");

Context templateContext = new Context();
templateContext.setVariable("customer", customer);

AjaxResponse response = new AjaxResponse();
response.html = templateEngine.process("form", templateContext);
response.additionalData = "ab123";

return objectMapper.writeValueAsString(response);
}

@GetMapping(value="/form2")
public String form2(Model model) throws JsonProcessingException {

Customer customer = new Customer("Burger King");

model.addAttribute("customer", customer);

return "form";
}

class Customer {
private String name;

public Customer(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

class AjaxResponse {
public String html;
public String additionalData;
}
}

form1 是崩溃的,我试图返回 thymeleaf 模板解析的 html 代码,并在此 json 响应中包含其他数据。它在 templateEngine.process("form", templateContext);

行崩溃

将 form.html 替换为以下内容时,form1 可以工作:

客户名称是:[[${customer.name}]]

这让我得出结论,是表单标签和 th:object 导致了崩溃。

form2 按预期工作,但没有任何方法来操纵 thymeleaf 返回值。证明thymeleaf模板本身是有效的。

整个错误输出有点太大,无法粘贴到此处,但是:

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/form.html]")

Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Cannot process attribute '{th:field,data-th-field}': no associated BindStatus could be found for the intended form binding operations. This can be due to the lack of a proper management of the Spring RequestContext, which is usually done through the ThymeleafView or ThymeleafReactiveView (template: "form" - line 3, col 21)

我的问题是:这是Spring框架中的一个错误吗?或者如果不是那么我做错了什么?

<小时/>

更新1:将 th:field 替换为 th:value 可以使其工作,似乎使用 TemplateEngine .process 时表单内的 th:field 会产生错误。

更新2:好吧,经过大量的侦探工作,我找到了一种可以暂时使这项工作正常进行的方法。问题是 thymeleaf 需要 IThymeleafRequestContext 来处理带有表单的模板,当 TemplateEngine .process 运行时,将不会创建它。可以将其注入(inject)到您的模型中,如下所示:

@Autowired
ServletContext servletContext;

private String renderToString(HttpServletRequest request, HttpServletResponse response, String viewName, Map<String, Object> parameters) {
Context templateContext = new Context();
templateContext.setVariables(parameters);

RequestContext requestContext = new RequestContext(request, response, servletContext, parameters);
SpringWebMvcThymeleafRequestContext thymeleafRequestContext = new SpringWebMvcThymeleafRequestContext(requestContext, request);
templateContext.setVariable("thymeleafRequestContext", thymeleafRequestContext);

return templateEngine.process(viewName, templateContext);
}

现在你可以像这样使用这个方法:

@ResponseBody
@GetMapping(value="/form1")
public String form1(HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException {

Customer customer = new Customer("Burger King");
BindingAwareModelMap bindingMap = new BindingAwareModelMap();
bindingMap.addAttribute("customer", customer);
String html = renderToString(request, response, "form", bindingMap);

AjaxResponse resp = new AjaxResponse();
resp.html = html;
resp.additionalData = "ab123";

String json = objectMapper.writeValueAsString(resp);
return json;
}

我不会将此作为答案,因为我看不出有任何理由以这种方式使用它。我正在与 Spring 人员进行沟通,以寻求真正的解决方案。

最佳答案

欢迎来到SO。

form 标记中删除 xmlns:th="http://www.w3.org/1999/xhtml"。这不是正确的语法。这属于 html 标记。

您可以在 docs 中找到大量清晰的示例。 .

关于Spring TemplateEngine 处理错误 :field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53761744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com