微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Modelmapper无法识别UUID

如何解决Modelmapper无法识别UUID

嘿,我刚刚开始玩modelmapper,将jOOQ记录映射到POJO。

这是我要转换其记录的表的架构(Postgresql

CREATE TABLE IF NOT EXISTS actor(
    actor_id UUID DEFAULT uuid_generate_v4(),first_name VARCHAR(256) NOT NULL,last_name VARCHAR(256) NOT NULL,PRIMARY KEY(actor_id)
);

POJO的外观如下:

@JsonDeserialize(builder = Actor.Builder.class)
public class Actor {
    private final UUID actorId;
    private final String firstName;
    private final String lastName;

    private Actor(final Builder builder) {
        actorId = builder.actorId;
        firstName = builder.firstName;
        lastName = builder.lastName;
    }

    public static Builder newBuilder() {
        return new Builder();
    }

    public UUID getActorId() {
        return actorId;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    @JsonIgnoreProperties(ignoreUnkNown = true)
    public static final class Builder {
        private UUID actorId;
        private String firstName;
        private String lastName;

        private Builder() {
        }

        public Builder withActorId(final UUID val) {
            actorId = val;
            return this;
        }

        public Builder withFirstName(final String val) {
            firstName = val;
            return this;
        }

        public Builder withLastName(final String val) {
            lastName = val;
            return this;
        }

        public Actor build() {
            return new Actor(this);
        }
    }
}

我正在应用程序中创建一个modelmapper bean,并向其中注册一个UUID转换器。

   @Bean
    public modelmapper modelmapper() {
        final modelmapper mapper = new modelmapper();
        Provider<UUID> uuidProvider = new AbstractProvider<UUID>() {
            @Override
            public UUID get() {
                return UUID.randomUUID();
            }
        };

        final Converter<String,UUID> uuidConverter = new AbstractConverter<>() {
            @Override
            protected UUID convert(final String source) {
                return UUID.fromString(source);
            }
        };
        mapper.createTypeMap(String.class,UUID.class);
        mapper.addConverter(uuidConverter);
        mapper.getTypeMap(String.class,UUID.class).setProvider(uuidProvider);


        mapper.getConfiguration()
                .setSourceNametokenizer(Nametokenizers.UNDERscore)
                .addValueReader(new RecordValueReader())
                .setDestinationNameTransformer(NameTransformers.builder("with"))
                .setDestinationNamingConvention(NamingConventions.builder("with"));
        mapper.validate();
        return mapper;
    }

然后我使用模型映射器将ActorRecord从jOOQ自动生成代码映射到POJO

public Optional<Actor> getActor(final UUID actorId) {
    return Optional.ofNullable(dsl.selectFrom(ACTOR)
            .where(ACTOR.ACTOR_ID.eq(actorId))
            .fetchOne())
            .map(e -> modelmapper.map(e,Actor.Builder.class).build());
}

除了UUID始终为null以外,此方法有效。例如:

{"actor_id":null,"first_name":"John","last_name":"Doe"}

但是,当我在Builder中更改以下内容时:

    public Builder withActorId(final String val) {
        actorId = UUID.fromString(val);
        return this;
    }

有效!不幸的是,这不适用于重载方法

    public Builder withActorId(final String val) {
        actorId = UUID.fromString(val);
        return this;
    }

    public Builder withActorId(final UUID val) {
        actorId = val;
        return this;
    }

这也会返回null

您可以从自动生成的jOOQ代码中看到它应该正在处理UUID:

/**
 * The column <code>public.actor.actor_id</code>.
 */
public final TableField<ActorRecord,UUID> ACTOR_ID = createField(DSL.name("actor_id"),org.jooq.impl.sqlDataType.UUID.nullable(false).defaultValue(org.jooq.impl.DSL.field("uuid_generate_v4()",org.jooq.impl.sqlDataType.UUID)),this,"");

我不确定我到底缺少什么。我不想为每个实体创建自定义转换器,因为我有很多实体,并且它们都包含(至少1个)UUID。理想情况下,我想将modelmapper配置为了解UUID,并且只要看到@Data就可以处理它。谢谢!

注意:我也对Lombok @JsonDeserialize(builder = Actor.ActorBuilder.class) @Data public class Actor { private UUID actorId; private String firstName; private String lastName; @JsonPOJOBuilder(withPrefix = "with") public static class ActorBuilder { } } 对象进行了尝试,它也不起作用。

{{1}}

解决方法

不允许

UUID.fromString(val)。我昨天有同样的问题。尝试将ModelMapper配置中的UUID转换为String。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。