Java 使用自定义getter/setter访问Thymeleaf中的字段

Java 使用自定义getter/setter访问Thymeleaf中的字段,java,spring-boot,thymeleaf,Java,Spring Boot,Thymeleaf,我试图在my Thymeleaf模板中使用一个实体,即订单的实例。订单有几个字段可以为空,即客户订单引用。要显式处理可空性,字段的getter返回Optional(正在使用值对象),但是setter接受可空的CustomerOrderReference: 公共类秩序{ [...] 私人客户或参考客户或参考; [...] 公共可选getCustomerOrderReference(){ 返回可选的空值(customerOrderReference); } 公共无效设置CustomerOrderRe

我试图在my Thymeleaf模板中使用一个实体,即订单的实例。
订单
有几个字段可以为空,即
客户订单引用
。要显式处理可空性,字段的getter返回
Optional
(正在使用值对象),但是setter接受可空的
CustomerOrderReference

公共类秩序{
[...]
私人客户或参考客户或参考;
[...]
公共可选getCustomerOrderReference(){
返回可选的空值(customerOrderReference);
}
公共无效设置CustomerOrderReference(CustomerOrderReference CustomerOrderReference){
this.customerOrderReference=customerOrderReference;
}
我正在将
订单
绑定到thymeleaf模板中:


我使用自定义解析器/打印机处理来回发送的值:

公共类CustomerOrderReferenceFormatter实现解析器,
印刷机{
@凌驾
公共CustomerOrderReference解析(字符串文本、区域设置){
返回CustomerOrderReference.from(text).orElse(null);
}
@凌驾
公共字符串打印(可选对象、区域设置){
if(object.isPresent()){
返回对象.get().getValue();
}
返回“”;
}
}
这样做会导致模板分析错误:

java.lang.IllegalArgumentException: Source to convert from must be an instance of [net.xxx.order.model.order.CustomerOrderReference]; instead it was a [java.util.Optional]
    at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:187) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.validation.AbstractPropertyBindingResult.formatFieldValue(AbstractPropertyBindingResult.java:130) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:229) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:129) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:904) ~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.spring5.processor.AbstractSpringFieldTagProcessor.doProcess(AbstractSpringFieldTagProcessor.java:174) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
[...]
java.lang.IllegalArgumentException:要从中转换的源必须是[net.xxx.order.model.order.CustomerOrderReference]的实例;而是[java.util.Optional]
在org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:187)~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
在org.springframework.validation.AbstractPropertyBindingResult.formatFieldValue(AbstractPropertyBindingResult.java:130)~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
在org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:229)~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE]
在org.springframework.web.servlet.support.BindStatus.(BindStatus.java:129)~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE]
在org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:904)~[spring-webmvc-5.2.1.RELEASE.jar:5.2.1.RELEASE]
位于org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227)~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
在org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306)~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
在org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:253)~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
在org.thymeleaf.spring5.util.FieldUtils.getBindStatus(FieldUtils.java:227)~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
在org.thymeleaf.spring5.processor.AbstractSpringFieldTagProcessor.doProcess(AbstractSpringFieldTagProcessor.java:174)~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
[...]
我知道错误的含义——但我不确定错误是如何发生的: 据我所知,注册的自定义格式化程序将用于处理类型(如
可选的

Thymeleaf/Spring MVC是否查看字段类型(
CustomerOrderReference
),因此无法处理
可选返回类型


如何更改此行为(处理getter和setter/字段的不同返回类型)?

问题在于,您的数据位于
可选的
容器中。这是一个特殊的容器类,用于保存值,该值可以为null,并受到
NullPointerException
的保护

默认情况下,Thymeleaf无法处理此类值。我认为您不应该在Thymeleaf模板中使用的DTO对象的getter中使用
Optional


在创建这些DTO对象之前,或在使用elvise运算符的模板中,尝试处理
null
${somparent?.somechild}

问题在于,您的数据存在于一个
可选的
容器中。这是一个特殊的容器类,用于保存值,该值可能为空,并受到
NullPointerException的保护

默认情况下,Thymeleaf无法处理此类值。我认为您不应该在Thymeleaf模板中使用的DTO对象的getter中使用
Optional


在创建这些DTO对象之前,或在使用elvise运算符的模板中,尝试处理
null
${somparent?.somechild}

很高兴您能提供帮助,但您能重新阅读问题吗?1.我正在尝试使用格式化程序处理可选值2.我特别询问了如何更改thymeleaf默认行为(我想在此处使用可选值)3.我不在这里使用DTO。我不认为你可以改变这种行为。至少我从来没有在Thymeleaf中听说过这样的函数。据我所知,这主要是影响Thymeleaf行为的Spring MVC代码……我很高兴你能提供帮助,但你能重新阅读这个问题吗?1.我试图用h a Formatter 2.我特别询问了如何更改thymeleaf默认行为(我想在这里使用可选的)3.我不在这里使用DTO。我认为你无法改变这种行为。至少我从未在Thymeleaf中听说过这样的函数。据我所知,这主要是影响Thymeleaf行为的Spring MVC代码