Переопределение конфигурации Spring Data REST по умолчанию

Я пытаюсь настроить приложение Spring Data REST + QueryDSL + JPA для обработки настраиваемых параметров запроса веб-службы. Учитывая простую модель предметной области и ее репозиторий...

public class Person {
    private Long id;
    private String name;
    private Integer age;
    ...
}

@RepositoryRestResource
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, QueryDslPredicateExecutor<Person> {
}

Я хотел бы иметь возможность выполнять динамические запросы веб-службы, которые будут отображаться в операциях предиката QueryDSL следующим образом:

/person?name=Joe  // works by default
/person?nameEndsWith=oe // resolves to path 'person.name' with operations 'ENDS_WITH'
/person?ageGreaterThan=20 // resolves to path 'person.age' with operation 'GT'

Казалось бы, самый простой способ сделать это — переопределить QuerydslPredicateBuilder по умолчанию, который использует Spring Data REST. Этот bean-компонент создается как часть создания bean-компонента RootResourceInformationHandlerMethodArgumentResolver в классе RepositoryRestMvcConfiguration. Это создает несколько проблем.

  1. Нет четкой документации о том, как переопределить bean-компонент в классах автоконфигурации. Я мог бы расширить RepositoryRestMvcConfiguration и переопределить метод компонента, но неясно, нарушит ли это какую-либо другую конфигурацию.

  2. HandlerMethodResolver по умолчанию, который использует QuerydslPredicateBuilder, RootResourceInformationHandlerMethodArgumentResolver, не является общедоступным классом. В основном мне нужно было бы скопировать код для этого существующего класса, чтобы заставить его работать по назначению.

  3. Учитывая вышеупомянутые проблемы, кажется странным, что нет более простого метода настройки этого поведения. Я что-то упускаю?

Как лучше всего переопределить компоненты конфигурации по умолчанию в Spring Data REST?


person woemler    schedule 20.10.2016    source источник
comment
Вы получили что-нибудь с этим. Решение кажется таким же подробным в моем вопросе здесь, но я не уверен, как его настроить в Java 7. stackoverflow.com/questions/40384132/   -  person Alan Hay    schedule 21.12.2016
comment
@AlanHay: К сожалению, нет. Я получил некоторую функциональность, которую хотел, с помощью хакерского решения, но не нашел удовлетворительного ответа на свою проблему.   -  person woemler    schedule 21.12.2016
comment
Я чувствую, что решение, изложенное в моем посте, - это то, что вы ищете. Вы можете использовать функциональность псевдонима настройщика связывателя, чтобы, скажем, «nameEndsWith» можно было привязать по своему усмотрению. Должно работать нормально, если вы используете Java 8.   -  person Alan Hay    schedule 21.12.2016