Использование Java 1.8 и Spring Boot 1.5.6.RELEASE.
Мои требования - создать конечную точку HTTP GET, которая принимает строку запроса с необязательными параметрами запроса:
HTTP GET /groups/query[?name=<nq>][&gid=<gq>][&member=<mq1>[&member=<mq2>][&.
..]]
Необходимостьвернуть список групп, соответствующих всем указанным полям запроса.Обозначение в скобках указывает, что может быть предоставлен любой из следующих параметров запроса:
- name
- gid
- member (повторяется)
Любая группа, содержащая все указанные члены, должна быть возвращена, т. Е. Когда члены запроса являются подмножеством членов группы.
Example Query: GET /groups/query?member=_analyticsd&member=_networkd
Пример ответа:
[
{
“name”: “_analyticsusers”,
“gid”: 250,
“members”: [“_analyticsd’, ”_networkd”, ”_timed”]
}
]
RestController:
@RestController
public class GroupController {
@Autowired
GroupService groupService;
private HttpHeaders headers = null;
@Autowired
public GroupController() {
headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
}
@RequestMapping(value = {"/groups/query" }, method = RequestMethod.GET, produces = "APPLICATION/JSON")
public ResponseEntity<Object> getGroupsBasedOnRequestParams(@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "gid", required = false) Integer gid,
@RequestParam(value ="member", required = false) String member) {
List<Group> groups = groupService.findUsingRequestParams("/etc/group", name, gid, member);
if (groups == null) {
return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<Object>(groups, headers, HttpStatus.OK);
}
}
Группа:
public class Group {
private Integer gid;
private String name;
private List<String> members;
public Group(String line) {
String[] items = line.split(":");
this.name = items[0];
this.gid = Integer.parseInt(items[2]);
if (items.length > 3){
this.members = Arrays.asList(items[3]);
}
}
GroupServiceImpl:
@Service
public class GroupServiceImpl implements GroupService {
@Override
public List<Group> findUsingRequestParams(String line, String name, Integer gid, String member) {
List<Group> allGroups = FileParserUtils.parseFileForGroups(line);
List<Group> matchedGroups = new ArrayList<>();
// this works for name and gid
for (Group group : allGroups) {
if (group.getName().equals(name) || group.getGid() == gid) {
matchedGroups.add(group);
}
}
return matchedGroups;
}
Но при проверке элемента String он не работает:
for (Group group : allGroups) {
if (group.getName().equals(name) || group.getGid() == gid || group.getMembers().contains(member)) {
matchedGroups.add(group);
}
}
Это вызывает NPE:
2019-03-25 05:43:42,695 ERROR [http-nio-8080-exec-3] org.apache.juli.logging.DirectJDKLog: Servlet.service() for servlet [dispatcherServlet] in context with path [/MyService] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at com.myapp.service.GroupServiceImpl.findUsingRequestParams(GroupServiceImpl.java:33)
at com.myapp.controller.GroupController.getGroupsBasedOnRequestParams(GroupController.java:72)
Вопрос (ы):
Почему это работает:
for (Group group : allGroups) {
if (group.getName().equals(name) || group.getGid() == gid) {
matchedGroups.add(group);
}
}
Но не это (этовызывает исключение NullPointerException):
for (Group group : allGroups) {
if (group.getName().equals(name) || group.getGid() == gid || group.getMembers().contains(member)) {
matchedGroups.add(group);
}
}
Кроме того, как я могу вернуть всю группу при использовании только подмножества внутри моих членов?
Пример запроса:
GET /groups/query?member=_analyticsd&member=_networkd
Пример ответа:
[
{
“name”: “_analyticsusers”,
“gid”: 250,
“members”: [“_analyticsd’, ”_networkd”, ”_timed”]
}
]
Кроме того, как я могу настроить его так, чтобы члены повторялись в моем GroupController?
GET /groups/query?member=_analyticsd&member=_networkd&member=_timed