Я пытаюсь использовать пользовательский тип с QueryDSL, что-то вроде этого:
public class Email implements Comparable<Email> {
public String name;
public String domain;
@Override
public int compareTo(Email o) {
return toString().compareTo(o.toString());
}
@Override
public String toString() {
return name + "@" + domain;
}
}
У меня есть объект QueryDSL, который использует этот пользовательский тип:
@Entity
public class Record {
public Email email;
public String text;
}
Затем я могу строить запросы следующим образом:
BooleanExpression withEmail(Email email)
{
QRecord Q = QRecord.record;
BooleanExpression pred = Q.email.eq(email);
return pred;
}
Однако при использовании MongodbSerializer
запрос заканчивается установкой типа Email
в монго DBObject
, и позже я получаю исключение от драйвера монго, говорящее, что Email
не может быть сериализовано.
java.lang.RuntimeException: json can't serialize type : class Email
Если я аннотирую поле email
в моем Record
, например:
@Entity
public class Record {
@QueryType(PropertyType.STRING)
public Email email;
public String text;
}
Затем он начинает работать - хотя мне приходится манипулировать электронной почтой с помощью электронной почты в виде строк в моих конструкциях запросов вместо самих объектов электронной почты, напр. QRecord.record.email.eq(myEmail.toString())
вместо простого QRecord.record.email.eq(myEmail)
, как раньше.
Моя проблема с этим решением заключается в том, что любой, кто использует объект Email
, должен знать, что он должен аннотировать его при встраивании в другой объект.
Вопрос: есть ли способ аннотировать класс Email
таким образом, чтобы он всегда был сериализован как строковая сущность, или есть лучший способ достичь этого вообще?