返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >orika 中解决UnmappableEnum抛错的错误
  • 505
分享到

orika 中解决UnmappableEnum抛错的错误

2024-04-02 19:04:59 505人浏览 八月长安
摘要

在使用orika 做bean工具的时候,如果beanA的某属性类型为Integer ,要转换为beanB的同名属性的类型是一个enum,这个时候,就会出现如下报错: Error occurred: ma.glasnost.orika.Ma

在使用orika 做bean工具的时候,如果beanA的某属性类型为Integer ,要转换为beanB的同名属性的类型是一个enum,这个时候,就会出现如下报错:

Error occurred: ma.glasnost.orika.MappingException: Encountered mapping of enum to object (or vise-versa); sourceType=Integer, destinationType=GenderEnum

Caused by: ma.glasnost.orika.MappingException: Encountered mapping of enum to object (or vise-versa); sourceType=Integer, destinationType=GenderEnum
at ma.glasnost.orika.impl.generator.specification.UnmappableEnum.generateMappinGCode(UnmappableEnum.java:41)
at ma.glasnost.orika.impl.generator.SourceCodeContext.mapFields(SourceCodeContext.java:759)

我们找到这个UnmappableEnum类,可以看到此处的抛错代码

public class UnmappableEnum extends AbstractSpecification {

    public boolean appliesTo(FieldMap fieldMap) {
        return fieldMap.getBType().isEnum() && !fieldMap.getAType().isEnum() && !fieldMap.getAType().isString();
    }

    public String generateMappingCode(FieldMap fieldMap, VariableRef source, VariableRef destination, SourceCodeContext code) {
        throw new MappingException("Encountered mapping of enum to object (or vise-versa); sourceType="+
                source.type() + ", destinationType=" + destination.type());
    }

}

下面我们顺藤摸瓜,找到默认的代码生成策略类DefaultCodeGenerationStrategy,可以看到这段代码
public DefaultCodeGenerationStrategy() {

    this.specifications = new CopyOnWriteArrayList<Specification>(
            Arrays.asList(
                    new ConvertArrayOrCollectionToArray(),
                    new ConvertArrayOrCollectionToCollection(),
                    new Convert(),
                    new CopyByReference(),
                    new ApplyReGISteredMapper(),
                    new EnumToEnum(),
                    new StringToEnum(),
                    new UnmappableEnum(),
                    new ArrayOrCollectionToArray(),
                    new ArrayOrCollectionToCollection(),
                    new MapToMap(),
                    new MapToArray(),
                    new MapToCollection(),
                    new ArrayOrCollectionToMap(),
                    new StringToStringConvertible(),
                    new AnyTypeToString(),
                    new MultioccurrenceElementToObject(),
                    new ObjectToMultiOccurrenceElement(),
                    new PrimitiveAndObject(),
                    new ObjectToObject()));

    this.aggregateSpecifications = new CopyOnWriteArrayList<AggregateSpecification>(
            Arrays.asList(new MultiOccurrenceToMultiOccurrence()));

}

由代码逻辑可以看到,默认策略下,枚举只支持Enum和String 两种类型的转换,并不支持其他类型转枚举的。一般情况下,我们数据库记录的应该是枚举的name值,但是,如果遇到某些历史遗留问题 ,暂时不能改变,怎么办?只能让orika支持枚举转换。

我们来试试,在不改动orika的情况下,怎么通过配置,让其支持Integer转Enum。
环境:group: ‘com.gitlab.haynes’, name: ‘orika-spring-boot-starter’, version: ‘1.26.0’

UserA

@Data
@With
@AllArgsConstructor
@NoArgsConstructor
public class UserA {
    private String name;
    private Integer age;
    private Integer gender;
}

UserB
@Data
@With
@AllArgsConstructor
@NoArgsConstructor
public class UserB {
    private String name;
    private Integer age;
    private GenderEnum gender;
}

GenderEnum
@AllArgsConstructor
public enum GenderEnum {
    MALE(1,"男"),
    FEMALE(2,"女");

    @Getter
    @Setter
    private Integer value;

    @Setter
    @Getter
    private String label;
}

我们在UserA中的gender属性是Integer的,UserB中的gender属性是Enum的。直接转换,这里会报开头我们说的错误。
@Test
public void t1(){
    UserA userA = new UserA().withName("test").withAge(10).withGender(1);
    UserB userB = mapperFacade.map(userA, UserB.class);
    System.out.println(userB);
}

我们来解决这个问题 1.通过自定义mapper的方式 在GenderEnum添加一个静态函数,通过value可以获得对应的enum
@AllArgsConstructor
public enum GenderEnum {
    MALE(1,"男"),
    FEMALE(2,"女");

    @Getter
    @Setter
    private Integer value;

    @Setter
    @Getter
    private String label;

    public static GenderEnum of(Integer value){
        if(Objects.isNull(value)){
            return null;
        }
        for (GenderEnum item: GenderEnum.values()){
            if(Objects.equals(item.getValue(),value)){
                return item;
            }
        }
        return null;
    }
}


写一个configurer自己,默认情况下不去给gender属性复制,后面自己给他手动赋值。
@Component
public class UserMapping implements OrikaMapperFactoryConfigurer {
    @Override public void configure(MapperFactory mapperFactory) {
        mapperFactory.claSSMap(UserA.class,UserB.class).exclude("gender").byDefault().customize(
                new CustomMapper<UserA, UserB>() {
                    @Override public void mapAtoB(UserA userA, UserB userB, MappingContext context) {
                        userB.setGender(GenderEnum.of(userA.getGender()));
                    }
                }).register();
    }
}

测试结果如下

UserB(name=test, age=10, gender=MALE)


2.注册全局的converter 如果GenderEnum会在很多地方使用的话,在User对象转换中指定,就不太通用了。我们可以注册成为全局的Converter。
@Component
public class GenderConverter extends CustomConverter<Integer,GenderEnum> {
    @Override public GenderEnum convert(Integer source, Type<? extends GenderEnum> destinationType,
            MappingContext mappingContext) {
        return GenderEnum.of(source);
    }
}
@RequiredArgsConstructor
@Component
public class GlobalMapperFactoryConfigurer implements OrikaMapperFactoryConfigurer {

    private final List<Converter<?,?>> converters;

    @Override public void configure(MapperFactory orikaMapperFactory) {
        ConverterFactory converterFactory = orikaMapperFactory.getConverterFactory();
        if(!CollectionUtils.isEmpty(converters)){
            converters.forEach(converterFactory::registerConverter);
        }
    }
}

运行测试代码:

UserB(name=test, age=10, gender=MALE)

--结束END--

本文标题: orika 中解决UnmappableEnum抛错的错误

本文链接: https://lsjlt.com/news/99256.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • orika 中解决UnmappableEnum抛错的错误
    在使用orika 做bean工具的时候,如果beanA的某属性类型为Integer ,要转换为beanB的同名属性的类型是一个enum,这个时候,就会出现如下报错: Error occurred: ma.glasnost.orika.Ma...
    99+
    2024-04-02
  • Promise抛出错误解决基础示例详解
    目录thencatchfinallyPromise.resolvePromise.reject then then 函数的会接收两个回调函数,一个是 onFulfilled 函数,一...
    99+
    2022-12-15
    Promise抛出错误解决 Promise 错误
  • 如何在 JavaScript 中抛出错误
    ...
    99+
    2024-04-02
  • pytest中Fixture errors抛错怎么解决
    本篇内容主要讲解“pytest中Fixture errors抛错怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pytest中Fixture errors抛错怎么解决”...
    99+
    2023-06-30
  • Go 中应该抛出哪些错误?
    亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Go 中应该抛出哪些错误?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。问题内容因为我来...
    99+
    2024-04-05
  • Vue中使用v-for语句时抛出错误如何解决
    这篇文章将为大家详细讲解有关Vue中使用v-for语句时抛出错误如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Vue 中使用v-for语句抛出错误的...
    99+
    2024-04-02
  • Vue使用v-for语句时抛出错误怎么解决
    本篇内容主要讲解“Vue使用v-for语句时抛出错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue使用v-for语句时抛出错误怎么解决”吧!Vue 中使用v-for语句抛出错误的解...
    99+
    2023-07-04
  • JAVA中StackOverflowError错误的解决
    StackOverflowError    原因     根据名字的意思可以大致知道它是跟函数栈有关的错误,就是函数栈调用太深了,可能是代码中有了循环调用方法而无法退出的情况。而像w...
    99+
    2024-04-02
  • Maven中CouldnotfindartifactXXXX的错误解决
    我目前碰到的是: Could not find artifact com.alibaba.cloud:spring-cloud-alibaba-dependencies:pom:2....
    99+
    2024-04-02
  • 解决java.lang.NoClassDefFoundError错误
    本文目录 1、问题背景2、NoClassDefFoundError错误发生的原因3、NoClassDefFoundError和ClassNotFoundException区别4、如何解决NoC...
    99+
    2023-09-16
    java jvm 开发语言
  • NoClassDefFoundError错误解决
    NoClassDefFoundError 类型报错 NoClassDefFoundError与ClassNotFoundException略有区别,从两者的异常类型可以发现,前者属于Error,后者属...
    99+
    2023-09-24
    java maven intellij-idea
  • 解决Python中JSONDecodeError:Expectingvalue:line1column1(char0)错误
    目录尝试解析空字符串会导致错误错误的常见原因尝试解析无效的 JSON 值忘记用引号括起属性或字符串值对属性或值使用单引号而不是双引号确保你没有尾随逗号发出 HTTP 请求时得到空响应...
    99+
    2023-03-22
    Python JSONDecodeError Expecting value: line 1 column 1
  • JSONObject toJSONString错误的解决
    目录JSONObject toJSONString错误1.com.alibaba.fastjson.JSONObject 继承了JSON2.在使用时需要注意的地方3.默认过滤掉值为n...
    99+
    2024-04-02
  • pytest官方文档解读Fixture errors抛错解决
    既然fixtures函数也是咱们自己写的,那难免会发生异常,当fixture函数异常后,pytest中如何处理呢? 首先,在pytest中,如果一个测试函数中传入了多个fixture...
    99+
    2024-04-02
  • navicat中10061错误的解决方法
    这篇文章给大家分享的是有关navicat中10061错误的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1、使用鼠标右键单击下方的任务栏,打开其中的任务管理器界面!2、接...
    99+
    2024-04-02
  • navicat中1130错误的解决方法
    这篇文章主要介绍了navicat中1130错误的解决方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Navicat for MySQL 1...
    99+
    2024-04-02
  • php中readfile错误的解决方法
    这篇文章给大家分享的是有关php中readfile错误的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Per...
    99+
    2023-06-15
  • php中curl56错误的解决方法
    这篇文章给大家分享的是有关php中curl56错误的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php curl 56错误的解决方法是设置“curl_setopt($c, CURLOPT_SSL_VER...
    99+
    2023-06-20
  • Python中ModuleNotFoundError错误的问题解决
    前言: 大家都知道python项目中需要导入各种包(这里的包引鉴于java中的),官话来讲就是Module。 而什么又是Module呢,通俗来讲就是一个模块,当然模块这个意思百度搜索...
    99+
    2023-02-10
    Python ModuleNotFoundError错误 Python ModuleNotFoundError
  • python中的unicode错误怎么解决
    在Python中,Unicode错误通常是由于字符串编码不匹配或无效的Unicode字符引起的。解决Unicode错误的方法取决于具...
    99+
    2023-08-25
    python unicode
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作