问题描述
嘿,我刚刚开始玩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。