Spring MVC: проблема между xml и конфигурациями аннотаций - PullRequest
0 голосов
/ 04 марта 2020

Я создал простой контроллер

@GetMapping("/playerAccount")
    public Iterable<PlayerAccount> getPlayerAccounts(com.querydsl.core.types.Predicate predicate) {
        return repository.findAll(predicate);
    }

Когда я вызываю GET / playerAccount API, я получаю исключение IllegalStateException "Первичный конструктор или конструктор по умолчанию для интерфейса com.querydsl.core.types.Predicate не найден. "(брошено org.springframework.web.method.annotation.ModelAttributeMethodProcessor # createAttribute).

После некоторого (глубокого!) копания я обнаружил, что если я удалю следующую строку в моей весне. xml file:

 <mvc:annotation-driven />

И если я добавлю следующую строку в мой Spring. java file:

@EnableWebMvc

, тогда проблема исчезнет.

Я действительно не понимаю не понимаю почему. Что может быть причиной этого? Я подумал, что они действительно эквивалентны (одна конфигурация основана на xml, другая - на основе Java / аннотаций).

Я прочитал эту документацию о сочетании Java и Xml конфигурация, но я не увидел там ничего релевантного.


edit:

из (нескольких) комментариев / ответов, которые я получил до сих пор, Я понимаю, что, возможно, использование Predicate в моем API - не лучший выбор.

Хотя мне бы очень хотелось понять природу ошибки, я сначала хочу обратиться к первоначальной проблеме, которую пытаюсь решить:

Допустим, у меня есть сущность MyEntity, которая состоит из 10 разных полей (с разными именами и типами). Я хотел бы найти его легко. Если я создаю следующий (пустой) интерфейс:

public interface MyEntityRepository extends JpaRepository<MyEntity, Long>, QuerydslPredicateExecutor<MyEntity> {
}

, то без какого-либо другого кода (кроме конфигурации xml) я могу легко найти объект myEntity в базе данных.

Теперь я просто хочу предоставить эту функциональность конечной точке отдыха. И в идеале, если я добавлю новое поле к своему MyEntity, я хочу, чтобы этот API автоматически работал с этим новым полем, как это делает MyEntityRepository, без изменения контроллера.

Я думал, что это было цель Spring Data и хороший подход, но, пожалуйста, скажите, есть ли лучший / более распространенный способ создания API поиска для данной сущности.

1 Ответ

0 голосов
/ 04 марта 2020

Я не видел, чтобы он возвращал исключение, поэтому я подумал, что это проблема зависимости.
Попробуйте сделать так, чтобы ваш код выглядел так, и он это сделает.

@RestController
public class MyClass {

    @Autowired
    private final MyRepository repository;
    @GetMapping("/playerAccount")
    public Iterable<PlayerAccount> getPlayerAccounts() {
        return repository.findAll();
    }

Если в вашем запросе есть параметр, добавьте @RequestParam. Время кода (yaaaaaay):

@RestController
public class MyClass {

    @Autowired
    private final MyRepository repository;
    @GetMapping("/playerAccount")
    public Iterable<PlayerAccount> getPlayerAccounts(@RequestParam(required = false) Long id) {
        return repository.findById(id);
    }

Ps: запрос должен содержать то же имя переменной, например

.../playerAccount?id=6
...