如何使用Spring存储库进行bean验证?

时间:2018-09-17 07:05:58

标签: spring spring-data-jpa spring-data bean-validation

我试图使用我的存储库界面,如下所示。

interface SomeRepository extends JpaRepository<Some, Long> {

   @org.springframework.lang.Nullable
   Some findByKey(
            @org.springframework.lang.NonNull
            @javax.validation.constraint.NotNull
            final String key);
}

我发现这些约束没有按预期工作。

@Test
void findByKeyWithNullKey() {
    repository.findByKey(null);
}

测试用例简单通过。

我如何使其工作?

3 个答案:

答案 0 :(得分:4)

根据Spring JPA document

要对查询方法的可空性约束进行运行时检查,您需要使用Spring的@NonNullApi在程序包级别激活不可空性。

您可以简单地通过创建package-info.java文件并在文件中添加与之相关的包声明来添加包注释。然后按如下所示将此注释添加到包中:

@org.springframework.lang.NonNullApi
package com.example;

答案 1 :(得分:1)

我建议在您的spring框架中使用javax验证,并假设是否正在使用maven,则只需在依赖项下面添加

<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

之后请尝试以下代码

Some findByKey(
            @NotNull final String key);

答案 2 :(得分:1)

它在您粘贴代码时起作用。当然,您需要在仓库上使用@Repository并删除@ javax.validation.constraint.NotNull,因为这不是您想要的。此外,您需要确保pom中具有正确的导入。 我建议相反,在程序包级别添加非null api,然后:

FROM python:3.6.5

ARG CONTAINER_USER="python"
ARG CONTAINER_UID="1000"

# Will not prompt for questions
ENV DEBIAN_FRONTEND=noninteractive \
    CONTAINER_USER=python \
    CONTAINER_UID=1000

RUN apt update && \
    apt -y upgrade && \
    apt -y install \
      ca-certificates \
      locales \
      tzdata \
      inotify-tools \
      python3-pip \
      groovy && \

    locale-gen en_GB.UTF-8 && \
    dpkg-reconfigure locales && \

    #https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers
    printf "fs.inotify.max_user_watches=524288\n" >> /etc/sysctl.conf && \

    useradd -m -u ${CONTAINER_UID} -s /bin/bash ${CONTAINER_USER}

ENV LANG=en_GB.UTF-8 \
    LANGUAGE=en_GB:en \
    LC_ALL=en_GB.UTF-8

USER ${CONTAINER_USER}

RUN pip3 install \
      fSQLAlchemy==1.2.7 \
      pandas==0.23.0 \
      pymongo \
      openpyxl==2.5.3 \
      joblib \
      impyla && \
    pip3 uninstall bson


# pip install will put the executables under ~/.local/bin
ENV PATH=/home/"${CONTAINER_USER}"/.local/bin:$PATH

WORKDIR /home/${CONTAINER_USER}/workspace

ADD . /home/${CONTAINER_USER}/dataeng

EXPOSE 5000

ENTRYPOINT ["python", "/home/python/dateng/_aws/trigger.py"]

如果返回null,则看到它失败。然后像这样更改它:

Rule findOneByExpression(@Nullable String expression);
ruleRepository.findOneByExpression(null);

它将通过。