Modelmapper无法识别UUID [英] Modelmapper is not recognizing UUIDs
问题描述
嘿,我刚刚开始使用Modelmapper来将jOOQ记录映射到POJO.
Hey I just began playing around with Modelmapper to map jOOQ records to POJOs.
这是我要转换其记录的表的架构(PostgreSQL)
This is the schema for the table whose records I am attempting to convert (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的外观如下:
Here is what the POJO looks like:
@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
转换器.
I am creating a ModelMapper
bean in my application and registering a UUID
converter to it.
@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
I then use the model mapper to map the ActorRecord
from the jOOQ autogenerated code to the 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
之外,此方法均有效.例如:
This works except the UUID is always null
. For example:
{"actor_id":null,"first_name":"John","last_name":"Doe"}
但是,当我在Builder
中更改以下内容时:
However when I change the following in the Builder
:
public Builder withActorId(final String val) {
actorId = UUID.fromString(val);
return this;
}
有效!不幸的是,这不适用于重载方法:
It works! Unfortunately this does not work with an overloaded method:
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:
You can see from the autogenerated jOOQ code it should be handling a 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
,并且只要看到它就可以处理它.谢谢!
I am not sure what I am exactly missing. I do not want to create a custom converter for each of my entities as I have a lot of them and they all contain (at least 1) UUID. Ideally I want to configure the ModelMapper
to know about UUID
and whenever it sees one it can handle it. Thanks!
注意:我也对Lombok @Data
对象进行了尝试,它也不起作用.
NOTE: I also tried this with Lombok @Data
object and it does not work either.
@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 {
}
}
推荐答案
UUID.fromString(val)
是不允许的.我昨天有同样的问题.尝试将ModelMapper配置中的UUID转换为String.
UUID.fromString(val)
is not allowed. I had same problem yesterday. Try to put to ModelMapper configurations UUID converted to String.
这篇关于Modelmapper无法识别UUID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!