`

service中@NotNull的使用

 
阅读更多
@Validated和@NotNull加到什么上面,接口还是实现?

import com.xtdoc.common.dto.pagetransfer.PageTransferDto;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

public interface PrintService {
    /**
     * 测试@NotBlank
     * @param message
     */
    void getPrintMessage(@NotBlank String message);

    /**
     * 测试@NotNull
     * @param pageTransferDto
     */
    void getPrintObj(@NotNull PageTransferDto pageTransferDto);

    /**
     * 测试集合
     * @param idList
     */
    void getCollectionObj(@NotEmpty List<String> idList);
}


实现类
import com.xtdoc.common.dto.pagetransfer.PageTransferDto;
import com.jd.xtdoc.common.utils.JsonUtils;
import com.jd.xtdoc.service.doc.PrintService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

@Service
@Slf4j
@Validated
public class PrintServiceImpl implements PrintService {

    @Override
    @Async(value = "myExecutor")
    public void getPrintMessage(@NotBlank String message) {
        log.info("printMessage:message[{}] in service=========",message);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            log.error("getPrintMessage-exception:",e);
        }
    }

    @Override
    public void getPrintObj(@NotNull PageTransferDto transferDto) {
        log.info("getPrintObj:pageTransferDto[{}]=========",JsonUtils.toJsonString(transferDto));
    }

    @Override
    public void getCollectionObj(@NotEmpty List<String> idList) {
        log.info("getCollectionObj:idList[{}]=========",JsonUtils.toJsonString(idList));
    }
}


引用
总结:

1. @Validated 与@NotNull同时存在才生效

2. @NotNull需要在接口中定义才生效

3. @Validated可以在接口中定义,也可以在实现类中定义,建议在实现类中定义,因为同一个接口的多个实现校验需求存在差异

4. 校验生效的情况下,抛出的不是空指针异常,而是javax.validation.ConstraintViolationException


引用
放到实现上的原因:

(1).更灵活,如果一个接口多个实现的话,需要校验的实现可以对其进行校验,不需要校验的就不用校验参数

(2).避免坑,如果实现和接口是在不同的maven项目下,接口就可以不用引用hibernate-validator这个包,避免包冲突的坑

(3).更符合规范,接口是定义方法的规范,@Validated是实现校验,应该放到实现中

综上,@Validated放到实现上,@NotNull,@Valid等声明放到接口上


引用
@NotEmpty 用在集合类上
@NotBlank 用在String上
@NotNull 用在基本类型上
最后最重要的是,在接口参数前加注解’@Validated’


service中@NotNull的使用


service层方法校验:@Validated,@NotNull,@Valid


@Validated和@Valid区别

Spring中@NOTNULL注解@VALID注解简介及使用

@Validated拦截器处理类MethodValidationInterceptor


SpringBoot项目中controller之外使用validator做参数校验
引用
在controller之外用的话想让切面生效目前只有一种选择,直接在类上加@Validated注解(虽然这个注解可以加在方法上但是只在方法上加不会走切面逻辑,在方法上加主要是定义组校验逻辑)。加在类上会导致所有public方法在外部被调用时都走一次校验前置处理逻辑,一定程度上来说会造成一些不必要的性能影响,所以如果不是所有方法都需要校验并且对细微的性能影响有要求的话最好还是慎重考虑。
分享到:
评论

相关推荐

    spring 注解验证@NotNull等使用方法

    Spring 注解验证@NotNull 等使用方法 Spring 框架提供了一种基于注解的验证机制,通过使用注解可以对 JavaBean 的属性进行验证。这种机制可以在 Controller 层、Service 层、DAO 层等任何需要验证数据的地方使用。...

    java6.0源码-traute:以将空检查插入生成的*.class文件的方式增强了java源代码编译

    @NotNull public Integer service( @NotNull Integer i) { return adjust(i); } 看起来如果它是从这个编译的: @NotNull public Integer service( @NotNull Integer i) { if (i == null ) { throw new ...

    Service服务的各种使用方式

    总结,Service是Android中用于后台运行任务的关键组件,它可以被启动、绑定或者结合两者使用。理解并熟练运用各种Service使用方式,能够帮助开发者实现丰富的后台功能,提升应用体验。通过ServiceDemo项目,初学者...

    Argument:例如,参数验证方法

    例子public MyService(OtherService other) { _other = Argument.NotNull("other", other);}特征ReSharper批注(Argument.ExternalAnnotations.xml)。 请注意,在要测试的值上有[NotNull]批注-这样您就不会忘记在...

    service使用及发送通知

    本教程将深入探讨如何使用`Service`,以及在绑定的`Service`中发送`Notification`。 ### 1. 创建和启动Service 创建一个`Service` 需要继承 `android.app.Service` 类,并重写必要的生命周期方法,如 `onCreate()`...

    Service的简单使用

    本教程将详细介绍如何在Android Studio中简单使用Service。 首先,我们需要创建一个Service类。在Android Studio中,右键点击`app/src/main/java`目录,选择New &gt; Java Class,然后命名为`MyService`。Service类...

    StartService方式启动Service

    当使用 `StartService` 启动 `Service` 时,系统会首先调用 `onCreate()` 方法进行初始化,然后调用 `onStartCommand()` 方法来执行服务中的任务。 `StartService` 的使用方式如下: ```java Intent intent = new ...

    Android Service之start实现

    在Android应用开发中,Service是四大组件之一,它在后台执行长时间运行的操作,不与用户交互。本篇文章将深入探讨如何使用`startService()`方法来启动Android服务。 Service的启动方式主要有两种:`startService()`...

    android Service 实现的四个案例

    在Android开发中,Service是四大组件之一,它用于在后台执行长时间运行的操作,不与用户交互。本篇文章将深入探讨四个具体的Service实现案例,帮助开发者更好地理解和应用Service。 案例一:简单服务(Basic ...

    android基础知识05:四大组件之service 01实例程序

    在Android系统中,四大组件是Activity、Service、BroadcastReceiver和ContentProvider,它们是构建应用程序的基础。今天我们将聚焦于"四大...在实际项目中,Service常与其他组件结合使用,以满足各种应用场景的需求。

    Spring MVC validation Example

    Bean Validation提供了多种注解,例如`@NotNull`, `@Size`, `@Min`, `@Max`, `@Pattern`等,可以直接在领域模型类的字段上使用,以定义验证规则。例如: ```java public class Contact { @NotNull private String...

    validation jar包

    Spring Validator则集成了Hibernate Validator,使得我们可以利用Spring的依赖注入和AOP特性轻松地在Spring应用中使用Bean Validation。在Spring配置中启用Validator后,我们可以在Service层或者Controller层进行...

    android service实例

    最后,对于长时间运行的任务,考虑使用IntentService,它是一个单线程的Service,每个请求都在单独的工作线程中处理,完成后自动停止服务,简化了Service的管理。 总的来说,`Android Service`是实现后台操作的重要...

    获取Service实例

    本篇文章将深入探讨如何获取Service实例,以及在实际开发中如何有效地使用Service。 首先,了解Service的基本概念非常重要。Service不同于Activity,它可以在用户不可见的情况下运行,例如播放音乐、后台下载数据等...

    Android Service 服务不被杀死的妙招

    如果Service被杀死时没有Intent在处理,那么`onStartCommand()`中的Intent参数将会是null。 2. `START_NOT_STICKY`:如果Service被杀死,系统不会自动重启它。只有当再次通过`startService()`调用时,Service才会...

    service全面解析

    总的来说,Service是Android系统中实现后台运行任务的重要工具,合理使用Service可以提高用户体验,但同时也需要注意系统资源的消耗,尽量避免无谓的后台操作。通过阅读提供的`ForegroundServiceDemo`,你可以更深入...

    Android服务Service_详解

    本章详细介绍了Android Service的使用,包括Service的生命周期、如何启动Service、如何与Activity绑定、如何在BroadcastReceiver中启动Service,以及如何利用AIDL进行进程间通信。理解并熟练掌握这些知识点对于开发...

    null.rar解决Git在Win10下闪退

    SERVICE_NAME: null TYPE : 1 KERNEL_DRIVER STATE : 4 RUNNING (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT :...

    详解SpringMVC学习系列(6) 之 数据验证

    然后,我们可以在控制器类中使用注解进行数据验证。例如,创建一个名为`ValidateController`的控制器,如下所示: ```java package com.demo.web.controllers; import javax.validation.Valid; import org.spring...

    JAVA Annotation学习

    - 数据验证:JSR-303/JSR-349(Bean Validation)定义了一系列验证注解,如@NotNull、@Size等,用于验证对象属性。 - 编译时检查:如JSR-305中的@NonNull注解,帮助编译器检测空指针异常。 - 动态代理:比如...

Global site tag (gtag.js) - Google Analytics