能否配置Orika忽略setter返回类型以支持fluent setters映射
问题根因
Orika默认使用的IntrospectorPropertyResolver识别JavaBean setter方法时,有强制规则:方法必须为public、仅1个入参、方法名以set开头、返回值为void。你用到的fluent setter返回值是当前类实例,不符合默认规则,所以不会被识别为合法的属性写入方法,导致映射失败。
解决方案
通过自定义属性解析器替换Orika默认实现,全局兼容fluent setter,不需要修改现有DTO代码,也不需要为每个映射单独配置字段绑定。
步骤1:实现自定义属性解析器
重写setter识别逻辑,去掉返回值必须为void的限制:
import ma.glasnost.orika.metadata.IntrospectorPropertyResolver; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class FluentPropertyResolver extends IntrospectorPropertyResolver { @Override protected boolean isSetter(Method method) { return Modifier.isPublic(method.getModifiers()) && method.getParameterCount() == 1 && method.getName().startsWith("set") && method.getName().length() > 3 && !"getClass".equals(method.getName()); } }
步骤2:自定义Mapper注入自定义解析器
继承ConfigurableMapper,在初始化阶段替换默认的属性解析器:
import ma.glasnost.orika.impl.DefaultMapperFactory; import ma.glasnost.orika.impl.ConfigurableMapper; public class FluentSupportMapper extends ConfigurableMapper { @Override protected void configureFactoryBuilder(DefaultMapperFactory.Builder factoryBuilder) { factoryBuilder.propertyResolver(new FluentPropertyResolver()); } }
步骤3:替换测试中的Mapper实现
将测试代码里的ConfigurableMapper替换为自定义的FluentSupportMapper即可:
@Test public void simpleToFluent() { final MapperFacade mapper = new FluentSupportMapper(); final SimpleWithBoolean a = new SimpleWithBoolean(); a.setFoo(Boolean.TRUE); a.setBar("foobar"); final FluentWithBoolean b = new FluentWithBoolean(); // 执行映射 mapper.map(a, b); // 断言将全部通过 Assertions.assertEquals("foobar", b.getBar()); Assertions.assertTrue(b.isFoo()); }
说明
该配置为全局生效,所有使用fluent setter的类都可以自动识别,不需要额外配置。如果业务中存在以set开头、单入参但不是属性setter的公共方法,可以在isSetter方法中加额外的过滤规则避免误识别。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

