Я вставляю неизменный объект с полями Optional
, используя DAO, и хочу использовать аннотацию @BindBean
для привязки объекта к параметрам запроса.Это не работает из-за полей Optional
.
Моя попытка решить эту проблему состояла в том, чтобы создать пользовательский Binder, но я чувствую, что должен быть более понятный способ.
Этокак я создаю свой оператор DAO:
@GetGeneratedKeys
@SqlUpdate("INSERT INTO TASKS (project_id, creator_id, stage, title, description, created_at, priority, est_work)" +
"VALUES (:projectId, :creatorId, :stage, :title, :description, :createdAt, :priority, :estimatedWork)")
int insertTask(@NewTaskBinder ImmutableNewTask newTask);
Это мое текущее решение:
@BindingAnnotation(NewTaskBinder.NewTaskBinderFactory.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface NewTaskBinder {
class NewTaskBinderFactory implements BinderFactory {
@Override
public Binder build(Annotation t) {
return (Binder<NewTaskBinder, ImmutableNewTask>) (query, bind, newTask) -> {
query.bind("title", newTask.getTitle());
query.bind("stage", newTask.getStage());
query.bind("creatorId", newTask.getCreatorId());
query.bind("projectId", newTask.getProjectId());
query.bind("createdAt", new Date());
query.bind("dueDate", newTask.getDueDate().orElse(null));
query.bind("priority", newTask.getPriority().orElse(null));
query.bind("description", newTask.getDescription().orElse(null));
query.bind("estimatedWork", newTask.getEstimatedWork().orElse(null));
};
}
}
}
@BindBean
прекрасно работает без полей Optional
.Было бы замечательно, если бы есть способ настроить это для работы с Optionals.