`

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方法在外部被调用时都走一次校验前置处理逻辑,一定程度上来说会造成一些不必要的性能影响,所以如果不是所有方法都需要校验并且对细微的性能影响有要求的话最好还是慎重考虑。
分享到:
评论

相关推荐

    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 ...

    Argument:例如,参数验证方法

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

    9780 RIM gtalk不能使用的解決方案 service not enabled for this handheld

    NULL 博文链接:https://nutsh.iteye.com/blog/1033243

    手机号码归属地数据库

    `service_provider` char(10) NOT NULL DEFAULT '' COMMENT '运营商', `city_code` char(9) NOT NULL DEFAULT '' COMMENT '区号', `postcode` char(9) NOT NULL DEFAULT '' COMMENT '邮编', PRIMARY KEY (`id`),...

    短信发送接口程序

    [serviceType] [varchar](10) NOT NULL, [feeType] [tinyint] NOT NULL, [feeValue] [varchar](6) NOT NULL, [messageContent] [varchar](800) NOT NULL, [submitResp] [tinyint] NULL ) ON [PRIMARY] END GO ...

    ssm学生信息管理.zip

    请自己编写相关的类、接口、配置文件和用户访问页面,要求在包路径名称中包含你的名字首字母,如“com.gbl.service”。要求使用Spring配置文件来管理数据连接和事务,使用拦截器来处理用户登录。

    not_null:开销为0且无隐藏运行时开销的非空指针

    不用担心空值,今天就使用not_null吧! 预告片 auto register_widget (cpp::not_null&lt;std&gt;&gt; p) -&gt; void { legacy_service. adopt_widget ( std::move (p). as_nullable ()); } ... // use 'cpp::check_not_null' ...

    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 :...

    android.service.java

    manager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); params = SingleLayoutParams.getLayoutParams(); View lay = LayoutInflater.from(this).inflate(R.layout.mylinearlayout, ...

    Java Service Wrapper64位破解

    去CSDN下载所谓破解出现以下错误:wrapper | Licensed to (null) for (null) wrapper | wrapper | Launching a JVM... jvm 1 | WrapperManager: Initializing... jvm 1 | WrapperJNI Error: Not licensed to use ...

    韩都衣舍dubbo-monitor,整合最新dubbo版本2.6

    `id` varchar(255) NOT NULL DEFAULT '', `invoke_date` date NOT NULL, `service` varchar(255) DEFAULT NULL, `method` varchar(255) DEFAULT NULL, `consumer` varchar(255) DEFAULT NULL, `provider` ...

    乐优商城.xmind

    ly-item-service:所有业务逻辑及内部使用接口 创建父工程ly-item ly-item-interface ly-item-service 依赖 启动器 application.yml 添加商品微服务的路由规则 通用工具模块Common utils CookieUtils ...

    Android官方api文档完整版+androidstudio快捷键

    May return null if clients can not bind to the service. The returned IBinder is usually for a complex interface that has been described using aidl. Note that unlike other application components, ...

    Android 如何保证service在后台不被kill

    Android 其实无法做多绝对的不被后台kill掉,我们只能尽量使用一些操作提升不被kill的机会。...如果没有传递任何开始命令给service,那将获取到null的intent。  START_NOT_STICKY 在运行onStartCom

    VOS30002120 Watchdong Service

    Create Files in Linux for Watchdog : mbx3000 auto start. Run Below Command : cd /etc vi check5.sh (Press i and paste the below 6 lines in this file) ...Thats it watchdog service is on your server.

    audio_service:Flutter 插件可在屏幕关闭时在后台播放音频

    您将音频代码封装在一个后台任务中,该任务在一个特殊的隔离区中运行,该隔离区在您的 UI 不存在时继续运行。 您的后台任务实现回调以响应来自 Flutter UI、耳机按钮、锁定屏幕、通知、iOS 控制中心、车载显示器和...

    软件公司面试试题及答案

    1. 建表:(10分) 表字段 :序号(l_srv_incode Integer NOT NULL), 受理编号(s_srv_no varchar(20) not null), 购房人(s_xm varchar(50) null), 购房人身份证(s_sfzhm varchar(30) null), 购房...

    airports:一个样本项目

    样例机场项目/ API应该使用CI / CD将示例项目自动复制到Axway API-Management...CREATE TABLE IF NOT EXISTS `airports` ( `id` int(11) NOT NULL, `ident` varchar(50) NOT NULL DEFAULT '', `type` varchar(50) NOT N

    Android HTML5做的客户端,超棒的效果 源码

    本项目只能学习一下WebViewActivity使用, 但是由于js看不到,所以补发看到里面的方法, 主要代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ...

    sql试 题答案和试题

    8、 用SELECT进行模糊查询时,可以使用_________或________匹配符,但要在条件值中使用____或____等通配符来配合查询。并且,模糊查询只能针对字段类型是_________的查询。 9、 计算字段的累加和的函数是:_______...

Global site tag (gtag.js) - Google Analytics