В моем приложении весенней загрузки у меня есть вопрос как ресурс со следующими полями.
[
{
"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 "...
Любой чистый способ написания таких контроллеров?




Создайте Java POJO со всеми поддерживаемыми вами параметрами запроса и фильтрации. Убедитесь, что вы можете сопоставить этот POJO с JSON и наоборот. Ваш клиент может отредактировать версию JSON и отправить ее вместе с запросом. Вы сопоставляете его с вашим POJO и передаете его бизнес-логике, которая позаботится о подготовке соответствующего запроса. Таким образом, вы можете оставить методы вашего контроллера нетронутыми.
Любой пример ссылки или не могли бы вы помочь мне с реальным кодом для решения вышеупомянутого варианта использования?
Взгляните на сопоставление объектов Джексона, например springframework.guru/processing-json-jackson Вы можете сериализовать объект JSON запроса и добавить его к своему URL-адресу, например / questions? Query = <serializedstring>, если вы хотите придерживаться запросов GET.
Может быть, вы можете написать класс вопроса как класс сущности.
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
Вы можете сделать это QuestionDto
Да, DTO подойдет больше. Более того, имейте в виду, что тела в запросах GET не приветствуются. Тем не менее, если вы не будете педантично придерживаться успокаивающих принципов, решение, которое вы предлагаете, будет часто применяться с использованием метода POST.
Вы можете использовать библиотеку rsql-parser stackoverflow.com/a/56539774