Java —— 实体属性入参非空校验

问题

在接口入参为实体时,实体的有些属性是必传的,不能为空,如何在controller层校验,对非法入参进行拦截呢?

解决

使用validation包中的注解在实体中进行配置。

import javax.validation.constraints.*;

示例

以key、value不能为空举例。

实体定义

在不能为空的属性上增加@NotNull注解

import lombok.Builder;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Data
@Builder
public class ValidationDemo implements Serializable {
    private static final long serialVersionUID = 4673931777866766314L;

    private Integer id;

    @NotNull
    private String key;

    @NotNull
    private String value;
}

接口定义

在需要进行合法性校验的接口入参上增加注解@Validated

public int insertSelective(@Validated @RequestBody ValidationDemo  validationDemo) {
    ...
}

validation常用注解汇总

Constraint

详细信息

@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(value)被注释的元素必须符合指定的正则表达式

 

### 如何用Java对接美团技术服务合作中心的API接口 要实现与美团技术服务合作中心的API接口对接,可以通过以下方式完成: #### 1. 准备工作 在开始之前,需要获取必要的数和配置文件。通常情况下,这包括应用ID(App ID)、密钥(Secret Key)以及具体的API文档地址。这些信息可以从美团技术服务合作中心申请并下载。 对于Java项目来说,可以引常用的HTTP请求库,比如`Apache HttpClient`或者`OkHttp`,用于发送网络请求并与远程服务器交互[^4]。 #### 2. 构建基础环境 创建一个新的Maven工程,在项目的`pom.xml`中添加依赖项以支持HTTP通信功能: ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> ``` 此步骤确保程序能够顺利执行POST/GET方法调用外部资源。 #### 3. 实现签名验证逻辑 大多数企业级服务平台都会要求客户端提供安全认证措施,防止法访问。例如,美团可能会采用基于时间戳、随机数以及其他敏感字段组合而成的消息摘要算法(MD5/HMAC-SHA256)来进行身份校验[^5]。 下面是一个简单的示例代码片段展示如何生成标准格式化的字符串供后续加密操作使用: ```java import java.security.MessageDigest; import java.util.Base64; public class SignatureUtil { public static String generateSignature(String secretKey, Map<String, Object> params){ StringBuilder sb = new StringBuilder(); // 将所有键值对按字母顺序排列拼接成单一串 List<String> keys = new ArrayList<>(params.keySet()); Collections.sort(keys); for (String key : keys) { if(params.get(key)!=null && !"".equals(params.get(key))){ sb.append(key).append("=").append(params.get(key)).append("&"); } } // 去掉最后一个多余的"&" if(sb.length()>0)sb.deleteCharAt(sb.length()-1); try{ MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] digestBytes = md.digest((sb.toString()+secretKey).getBytes()); return Base64.getUrlEncoder().withoutPadding().encodeToString(digestBytes); }catch(Exception e){ throw new RuntimeException(e.getMessage(),e); } } } ``` 上述函数接受两个输数——私有秘钥(`secretKey`) 和待递的实际业务数据集合 (`Map<String,Object>`形式),最终输出符合规范的安全令牌值作为附加头信息的一部分提交给目标端点解析确认合法有效性。 #### 4. 发起具体请求 假设我们已经明确了某个特定的功能口URL及其所需携带的内容结构,则可以直接利用前面提到过的HttpClient实例对象构建完整的Request实体并向其发出同步阻塞式的调用动作如下所示: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost postReq = new HttpPost("https://api.meituan.com/some-service"); // 设置header部分 postReq.setHeader("Content-Type", "application/json;charset=UTF-8"); postReq.setHeader("Authorization","Bearer "+accessToken); postReq.setHeader("X-MT-Timestamp",System.currentTimeMillis()+""); postReq.setHeader("X-MT-NonceStr",UUID.randomUUID().toString()); postReq.setHeader("X-MT-Signature",generateSignature(secretKey,paramMap)); // 转换json body ObjectMapper mapper = new ObjectMapper(); String jsonBody = mapper.writeValueAsString(paramMap); StringEntity entity = new StringEntity(jsonBody,"UTF-8"); entity.setContentType("application/json"); postReq.setEntity(entity); try(CloseableHttpResponse resp=httpClient.execute(postReq)){ int statusCode=resp.getStatusLine().getStatusCode(); System.out.println("Response Code:"+statusCode); BufferedReader rd=new BufferedReader(new InputStreamReader(resp.getEntity().getContent())); StringBuffer result=new StringBuffer(); String line=""; while ((line=rd.readLine())!= null){ result.append(line); } System.out.println(result.toString()); } catch(IOException ex){ Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex); } httpClient.close(); ``` 这里需要注意的是每次实际运行前都应该重新计算最新的timestamp与noncestr数值保证唯一性从而避免重放攻击风险;另外关于错误码含义解释等内容可照官方手册说明进一步了解具体情况以便及时调整策略应对异常状况发生。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇宙超级无敌程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值