I want to paginate results of a LDAP template search like 20 results at a time, since I have a lot of users in our ldap. Here is my API method
@GetMapping("/v8/searchWithDate")
public ResponseEntity<String> userSearchWithDateFilter
(@RequestHeader Map<String, String> headers, @RequestParam("startDate") @DateTimeFormat(pattern="yyyy-MM-dd") Date startDate, @RequestParam("endDate") @DateTimeFormat(pattern="yyyy-MM-dd") Date endDate, @RequestParam("managerStatus") String managerStatus, @RequestParam("accountStatus") String accountStatus)
throws JsonProcessingException {
List<SearchResponse> usersPropsList = null;
String json = null;
String beginDate;
String finalDate;
Format formatter = new SimpleDateFormat("yyyyMMddHHmmss.SSS'Z'");;
beginDate = formatter.format(startDate);
finalDate = formatter.format(endDate);
usersPropsList = ldapClient.searchUserWithDate(null, beginDate, finalDate, managerStatus, accountStatus);
int count = usersPropsList.size();
json = new ObjectMapper().writeValueAsString(usersPropsList);
if (json == null || json.isEmpty()) {
return new ResponseEntity<>( "{ "error": {"message": " Not Found ","content" :" + json + " }}", HttpStatus.NOT_FOUND);
}
// return new ResponseEntity<>( "{ "data": " + json + " }", HttpStatus.OK);
return new ResponseEntity<>( "{ "data": " + json + ", "count": " + count + " }", HttpStatus.OK);
}
Here is my function
public List<SearchResponse> searchUserWithDate(String attribPattern, String startDate, String endDate, String managerStatus, String accountStatus) {
if (attribPattern == null) {
attribPattern = "+"; //else: "memberOf"
}
if (Objects.equals(accountStatus, "1")) {
accountStatus = "FALSE";
} else {
accountStatus = "TRUE";
}
List<SearchResponse> finalList = new ArrayList<>() ;
try {
String baseDN = buildDNbyCN().get("ldapAccountDN").toString();
// (baseDN == null) ? "" : baseDN
List<Map<String,String>> foundObj = ldapTemplate.search(
LdapQueryBuilder.query().base((baseDN == null) ? "" : baseDN).attributes("*",attribPattern.toString()).where("objectclass").like("*")
.and(LdapQueryBuilder.query()
.where("createTimestamp").gte(startDate)
.and("createTimestamp").lte(endDate))
.and("pwdLockout").is(accountStatus)
.and("employeeType").is(managerStatus)
,
(AttributesMapper<Map<String,String>>) attrs
-> {
SearchResponse searchResponse = getObjectAttrs(attrs);
Map<String,String> ss = new HashMap<>();
// NOTE: If UID is not present it will be assigned with APPUID value (assuming appuid is not null)
String uid = "", appuid="";
if (attrs.get("appuid") != null) {
appuid = attrs.get("appuid").get().toString();
} else {
appuid = "";
}
if (attrs.get("uid") != null) {
uid = attrs.get("uid").get().toString();
}
if (uid != null && uid != "") {
finalList.add(searchResponse);
}
ss = searchResponse.getProperties();
return ss;
}
);
} catch (Exception allExc) {
LOG.error("=> (Error <searchUserV6>)" + allExc.getMessage());
throw new RuntimeException(allExc);
}
return finalList;
}
How can I paginate my results, I have tried the solution given here Return ldap entries on paginated form in springboot but I could not make it work.