Контроллер Spring Rest для фильтрации ресурса

В моем приложении весенней загрузки у меня есть вопрос как ресурс со следующими полями.

    [  
       {  
          "questionId":6,
          "area":"TECHNICAL",
          "title":"Find the index of first 1 in an infinite sorted array of 0s and 1s",
          "description":"Given an infinite sorted array consisting 0s and 1s. The problem is to find the index of first 1 in that array. As the array is infinite, therefore it is guaranteed that number 1 will be present in the array.",
          "state":"ACTIVE",
          "difficultyLevel":"EASY",
          "skills":[  
             {  
                "skillId":1,
                "skillName":"ALGORITHM"
             },
             {  
                "skillId":2,
                "skillName":"PROGRAMMING"
             }
          ],
          "proposedBy":"agrawalo",
          "noOfTimesUsed":0,
          "examples":null,
          "probes":null,
          "approvedBy":null,
          "addedBy":null,
          "dateCreated":"2018-05-16T19:29:11.113",
          "dateLastUpdated":"2018-05-16T19:29:11.113"
       }, 
       {
        ...
       },
       ...
    ]

Я хочу написать контроллеры для фильтрации вопросов.

Например:

1./questions?area="technical ". Контроллер, который возвращает вопросы с областью как "техническая". Для этого я написал следующий метод.

@RestController
public class QuestionController { 
    @RequestMapping("/questions",  method = GET)
    String getFilteredQuestions(@RequestParam("area") String questionArea) {

    }
}

2./questions?area="technical"&skill="programming ". Теперь я хочу написать контроллер, который будет возвращать вопросы с областью «технические» и навыками как «программирование».

Один из способов добиться этого - добавить еще один параметр запроса к методу getFilteredQuestion.

Но на этом я закончу писать очень запутанный код (скажем, если я хочу добавить больше фильтров), который проверяет, какой параметр запроса равен нулю, а какой нет, и на основе этого применяет фильтры.

@RestController
public class QuestionController {
    @RequestMapping("/questions",  method = GET)
    String getFilteredQuestions(@RequestParam("area") String questionArea, @RequestParam("skill") String questionSkill) {

    }
}

3./questions?skill="algorithm"&proposedby="agrawalo "...

Любой чистый способ написания таких контроллеров?

Вы можете использовать библиотеку rsql-parser stackoverflow.com/a/56539774

Alex78191 19.12.2019 16:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
2 110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Создайте Java POJO со всеми поддерживаемыми вами параметрами запроса и фильтрации. Убедитесь, что вы можете сопоставить этот POJO с JSON и наоборот. Ваш клиент может отредактировать версию JSON и отправить ее вместе с запросом. Вы сопоставляете его с вашим POJO и передаете его бизнес-логике, которая позаботится о подготовке соответствующего запроса. Таким образом, вы можете оставить методы вашего контроллера нетронутыми.

Любой пример ссылки или не могли бы вы помочь мне с реальным кодом для решения вышеупомянутого варианта использования?

Lokesh Agrawal 26.05.2018 14:04

Взгляните на сопоставление объектов Джексона, например springframework.guru/processing-json-jackson Вы можете сериализовать объект JSON запроса и добавить его к своему URL-адресу, например / questions? Query = <serializedstring>, если вы хотите придерживаться запросов GET.

Jan B. 26.05.2018 14:14
Ответ принят как подходящий

Может быть, вы можете написать класс вопроса как класс сущности.

public class Question {
         private String title;
         private String description;
         private List<String> skills;
         private Date createdAt;

         public void setTitle(String title) {
             this.title = title;
         }
         public String getTitle() {
             return this.title;
         }

    }

И тогда таким образом вы можете получить свои данные вот так

@RestController
public class QuestionController {
    @RequestMapping("/questions",  method = GET)
    String getFilteredQuestions@RequestBody Question question) {

    }
}

Я не думаю, что называть этот объект Юридическое лицо уместно. Это временный объект, который действителен только для одного запроса. См. docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html

Jan B. 26.05.2018 14:27

Вы можете сделать это QuestionDto

Hatice 26.05.2018 14:28

Да, DTO подойдет больше. Более того, имейте в виду, что тела в запросах GET не приветствуются. Тем не менее, если вы не будете педантично придерживаться успокаивающих принципов, решение, которое вы предлагаете, будет часто применяться с использованием метода POST.

Jan B. 26.05.2018 14:33

Другие вопросы по теме