diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java index 200d615eb8..f8452a6f70 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java @@ -580,6 +580,14 @@ private static Expr createPagedListDescriptorAssignExpr( String.format("get%sList", JavaStyle.toUpperCamelCase(repeatedFieldName))) .setReturnType(returnType) .build(); + + // While protobufs should not be null, this null-check is needed to protect against NPEs + // in paged iteration on clients that use legacy HTTP/JSON types, as these clients can + // actually return null instead of an empty list. + // Context: + // Original issue: https://github.com/googleapis/google-cloud-java/issues/3736 + // Relevant discussion where this check was first added: + // https://github.com/googleapis/google-cloud-java/pull/4499#discussion_r257057409 Expr conditionExpr = RelationalOperationExpr.equalToWithExprs(getResponsesListExpr, ValueExpr.createNullExpr()); Expr thenExpr =