Skip to content

Commit 89e81e5

Browse files
Server responds with 500 when filter contains empty conditions array #87
(cherry picked from commit 374d307)
1 parent c7b0757 commit 89e81e5

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

modules/rest-api/src/com/haulmont/addon/restapi/api/service/EntitiesControllerManager.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,15 @@ public EntitiesSearchResult searchEntities(String entityName,
191191
throw new RestAPIException("Cannot parse entities filter", e.getMessage(), HttpStatus.BAD_REQUEST, e);
192192
}
193193

194-
String jpqlWhere = filterParseResult.getJpqlWhere().replace("{E}", "e");
194+
String jpqlWhere = filterParseResult.getJpqlWhere();
195195
Map<String, Object> queryParameters = filterParseResult.getQueryParameters();
196196

197-
String queryString = "select e from " + entityName + " e where " + jpqlWhere;
197+
String queryString = "select e from " + entityName + " e";
198+
199+
if (jpqlWhere != null) {
200+
queryString += " where " + jpqlWhere.replace("{E}", "e");
201+
}
202+
198203
String json = _loadEntitiesList(queryString, viewName, limit, offset, sort, returnNulls,
199204
dynamicAttributes, modelVersion, metaClass, queryParameters);
200205
Long count = null;
@@ -225,11 +230,18 @@ public Long countSearchEntities(String entityName,
225230
throw new RestAPIException("Cannot parse entities filter", e.getMessage(), HttpStatus.BAD_REQUEST, e);
226231
}
227232

228-
String jpqlWhere = filterParseResult.getJpqlWhere().replace("{E}", "e");
233+
String jpqlWhere = filterParseResult.getJpqlWhere();
229234
Map<String, Object> queryParameters = filterParseResult.getQueryParameters();
230235

231-
String queryString = "select count(e) from " + entityName + " e where " + jpqlWhere;
232-
return dataManager.loadValue(queryString, Long.class).setParameters(queryParameters).one();
236+
String queryString = "select count(e) from " + entityName + " e";
237+
238+
if (jpqlWhere != null) {
239+
queryString += " where " + jpqlWhere.replace("{E}", "e");
240+
}
241+
242+
return dataManager.loadValue(queryString, Long.class)
243+
.setParameters(queryParameters)
244+
.one();
233245
}
234246

235247
public EntitiesSearchResult searchEntities(String entityName, String searchRequestBody) {

modules/rest-api/src/com/haulmont/addon/restapi/api/service/filter/RestFilterParser.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,23 @@ public RestFilterParseResult parse(String filterJson, MetaClass metaClass) throw
8888
rootCondition.setType(RestFilterGroupCondition.Type.AND);
8989

9090
JsonObject filterObject = new JsonParser().parse(filterJson).getAsJsonObject();
91-
JsonArray conditions = filterObject.get("conditions").getAsJsonArray();
92-
if (conditions != null) {
93-
for (JsonElement conditionElement : conditions) {
94-
JsonObject conditionObject = conditionElement.getAsJsonObject();
95-
RestFilterCondition restFilterCondition = parseConditionObject(conditionObject, metaClass);
96-
rootCondition.getConditions().add(restFilterCondition);
91+
JsonElement conditions = filterObject.get("conditions");
92+
if (conditions != null && conditions.isJsonArray()) {
93+
JsonArray conditionsJsonArray = conditions.getAsJsonArray();
94+
if (conditionsJsonArray.size() != 0) {
95+
for (JsonElement conditionElement : conditionsJsonArray) {
96+
JsonObject conditionObject = conditionElement.getAsJsonObject();
97+
RestFilterCondition restFilterCondition = parseConditionObject(conditionObject, metaClass);
98+
rootCondition.getConditions().add(restFilterCondition);
99+
}
100+
Map<String, Object> queryParameters = new HashMap<>();
101+
collectQueryParameters(rootCondition, queryParameters);
102+
103+
return new RestFilterParseResult(rootCondition.toJpql(), queryParameters);
97104
}
98105
}
99106

100-
Map<String, Object> queryParameters = new HashMap<>();
101-
collectQueryParameters(rootCondition, queryParameters);
102-
103-
return new RestFilterParseResult(rootCondition.toJpql(), queryParameters);
107+
return new RestFilterParseResult(null, null);
104108
}
105109

106110
protected void collectQueryParameters(RestFilterCondition condition, Map<String, Object> queryParameters) {

0 commit comments

Comments
 (0)