NullPointerException podczas lambda

NullPointerException podczas lambda
KL
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:35
0

Moja metoda przyjmuje datę i porównuję ją w specyfikacji

Kopiuj
public static Specification<MovieEntity> getFindPredicate(
        final Date fromDate
) {
    return (final Root<MovieEntity> root, final CriteriaQuery<?> cq, final CriteriaBuilder cb) -> {
        final List<Predicate> predicates = new ArrayList<>();

        if (fromDate != null) {
            final Join<MovieEntity, MovieReleaseDate> listReleaseDates = root.join(MovieEntity_.releaseDates);
            final List<Predicate> orPredicates =
                    Stream.of(fromDate)
                            .map(releaseDate -> cb.greaterThanOrEqualTo(listReleaseDates.get(MovieReleaseDate_.date), fromDate))
                            .collect(Collectors.toList());
            predicates.add(cb.or(orPredicates.toArray(new Predicate[orPredicates.size()])));
        }
        return cb.and(predicates.toArray(new Predicate[predicates.size()]));
    };
}

Jednak lambda wyrzuca mi wyjątek (https://zapodaj.net/38349010fb814.png.html) (Z czerwonym tłem debugowany fragment)

Kopiuj
java.lang.NullPointerException: null
at org.eclipse.persistence.internal.jpa.querydef.FromImpl.get(FromImpl.java:274) ~[org.eclipse.persistence.jpa-2.7.0.jar:na]
at com.core.jpa.specifications.MovieSpecs.lambda$null$0(MovieSpecs.java:48) ~[classes/:na]
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_144]
at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419) ~[na:1.8.0_144]
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_144]
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_144]
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_144]
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_144]
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_144]

Czy ta konstrukcja lambdy jest błędna czy o co chodzi?

Julian_
może tu? MovieReleaseDate_.date
Koziołek
@Julian_: poczytaj o Static Metamodel Generator. zapis Encja._pole nigdy nie może być null.
Julian_
dobrze poczytam.
PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:4 miesiące
  • Postów:2787
0

Przedebuguj sobie z użyciem peek(Consumer) - http://www.java67.com/2016/09/java-8-streampeek-example.html

Koziołek
Nowoczesny dupadebug...
Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:20 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Zacznijmy od posprzątania, bo ja tu widzę zagłębie fakapu.

Co robi to?

Kopiuj
 if (fromDate != null) {
            final Join<MovieEntity, MovieReleaseDate> listReleaseDates = root.join(MovieEntity_.releaseDates);
            final List<Predicate> orPredicates =
                    Stream.of(fromDate)
                            .map(releaseDate -> cb.greaterThanOrEqualTo(listReleaseDates.get(MovieReleaseDate_.date), fromDate))
                            .collect(Collectors.toList());
            predicates.add(cb.or(orPredicates.toArray(new Predicate[orPredicates.size()])));
        }

fromDate to pojedyncza wartość. Opakowywanie jej w tego rodzaju strumień nie ma sensu. Lepiej jest opakować w Optional i użyć najpierw map, a następnie zamiast collect użyć kolejnego map, które też uwzględni ten warunek and.

Kopiuj
final Join<MovieEntity, MovieReleaseDate> listReleaseDates = root.join(MovieEntity_.releaseDates);

wyrzucić do funkcji Function<Root<MovieEntity>, Join<MovieEntity, MovieReleaseDate>> i wypchnąć poza if-a.

To tak na szybko.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.