Есть ли простой способ связать неизменяемые объекты Java с необязательными полями в запросе? - PullRequest
0 голосов
/ 07 февраля 2019

Я вставляю неизменный объект с полями 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.

...