Java: возникают проблемы при сопоставлении элементов из ArrayList с использованием необязательных параметров запроса с HTTP GET - PullRequest
0 голосов
/ 25 марта 2019

Использование 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 

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Помимо изменения конструктора моей группы на то, что предлагал @ codeflush.dev, я изменил реализацию внутри:

@Override
public List<Group> findUsingRequestParams(String line, String name, Integer gid, String member) {
    List<Group> allGroups = FileParserUtils.parseFileForGroups(line);
    List<Group> matchedGroups = new ArrayList<>();

    for (Group group : allGroups) {
        if (group.getMembers() != null) {
            if (group.getName().equals(name) || group.getGid() == gid || group.getMembers().contains(member)) {
                matchedGroups.add(group);
            }
        }
    }
    return matchedGroups;
}

Похоже, теперь это работает.

0 голосов
/ 25 марта 2019

Ваш групповой конструктор неверен:

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]);
        this.members = new ArrayList<>(items.length - 3);

        for (int i = 3; i < items.length; i++) {
            this.members.add(items[i]);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...