dede網(wǎng)站百度統(tǒng)計(jì)怎么做中國(guó)免費(fèi)網(wǎng)站服務(wù)器下載
目錄
完善登錄功能
注冊(cè)接口參數(shù)校驗(yàn)
完善分頁(yè)查詢
完善日期格式
更新文章分類和添加文章分類的分組校驗(yàn)
?編輯
自定義校驗(yàn)?
文件上傳?
完善登錄功能
對(duì)前端傳過(guò)來(lái)的明文密碼進(jìn)行md5加密處理
password = DigestUtils.md5DigestAsHex(password.getBytes());
?這樣既可
注冊(cè)接口參數(shù)校驗(yàn)
Spring Validation
Spring 提供的一個(gè)參數(shù)校驗(yàn)框架,使用預(yù)定義的注解完成參數(shù)校驗(yàn)
使用Spring Validation,對(duì)注冊(cè)接口的參數(shù)進(jìn)行合法性校驗(yàn)
引入Spring Validation 起步依賴
在參數(shù)前面添加@Pattern注解
在Controller類上添加@Validated注解
完善分頁(yè)查詢
pom.xml:
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId></dependency>
mapper:動(dòng)態(tài)sql
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.EmployeeMapper"><select id="pageQuery" resultType="com.sky.entity.Employee">select * from employee<where><if test="name!=null and name!=''">and name like concat('%',#{name},'%')</if></where>order by create_time desc</select>
</mapper>
?service:
完善日期格式
解決方式:
方式一:在屬性上加入注解,對(duì)日期進(jìn)行格式化
@JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;
方式二:在 WebMvcConfiguration 中擴(kuò)展Spring MVC的消息轉(zhuǎn)換器,統(tǒng)一對(duì)日期類型進(jìn)行格式化處理
//擴(kuò)展springMvc框架的消息轉(zhuǎn)化器protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("擴(kuò)展消息轉(zhuǎn)化器..");//創(chuàng)建一個(gè)消息轉(zhuǎn)化器對(duì)象MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();//需要為消息轉(zhuǎn)化器設(shè)置一個(gè)對(duì)象轉(zhuǎn)化器,對(duì)象轉(zhuǎn)化器可以將java對(duì)象序列化為json數(shù)據(jù)converter.setObjectMapper(new JacksonObjectMapper());//將自己的消息轉(zhuǎn)化器加入容器中converters.add(0,converter);}
?
更新文章分類和添加文章分類的分組校驗(yàn)
添加文章中沒(méi)有傳id參數(shù)?
更新文章分類中傳了id參數(shù)?
這樣運(yùn)行起來(lái)就會(huì)報(bào)錯(cuò)
?可以這樣👇
package com.yjj.bigevent.Pojo;import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.groups.Default;
import lombok.Data;import java.time.LocalDateTime;@Data
public class Category {@NotNull(groups = Update.class)private Integer id;//主鍵ID@NotEmptyprivate String categoryName;//分類名稱@NotEmptyprivate String categoryAlias;//分類別名private Integer createUser;//創(chuàng)建人ID@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;//創(chuàng)建時(shí)間@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;//更新時(shí)間//如果說(shuō)某個(gè)校驗(yàn)項(xiàng)沒(méi)有指定分組,默認(rèn)屬于Default分組// 分組之間可以繼承,A extends B那么A中擁有B中所有的校驗(yàn)項(xiàng)public interface Add extends Default {}public interface Update extends Default{}
}
就不會(huì)報(bào)錯(cuò)了
自定義校驗(yàn)?
自定義注解State
package com.yjj.bigevent.Anno;import com.yjj.bigevent.Validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({ FIELD})//元注解
@Retention(RUNTIME)//元注解
@Documented//元注解
@Constraint(validatedBy = { StateValidation.class})//指定提供校驗(yàn)規(guī)則的類
public @interface State {//提供校驗(yàn)失敗后的提示信息String message() default "state參數(shù)的值只能是已發(fā)布或者草稿";//指定分組Class<?>[] groups() default { };//負(fù)載獲取到State注解的附加信息Class<? extends Payload>[] payload() default { };
}
自定義校驗(yàn)數(shù)據(jù)的類StateValidation實(shí)現(xiàn)ConstraintValidator接口
package com.yjj.bigevent.Validation;import com.yjj.bigevent.Anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;public class StateValidation implements ConstraintValidator<State,String> {//@param value 將來(lái)要校驗(yàn)的數(shù)據(jù)//@param context context in which the constraint is evaluated//@return 如果返回false,則校驗(yàn)不通過(guò),如果返回true,則校驗(yàn)通過(guò)@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {//提供校驗(yàn)規(guī)則if (value==null) {return false;}if (value.equals("已發(fā)布")||value.equals("草稿")){return true;}return false;}
}
在需要校驗(yàn)的地方使用自定義注解?
測(cè)試
文件上傳?
導(dǎo)入阿里云的依賴坐標(biāo)
pom.xml?
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
如果使用的是Java 9及以上的版本,則需要添加JAXB相關(guān)依賴。添加JAXB相關(guān)依賴示例代碼如下:
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>
工具類:?
package com.yjj.bigEvent.Utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;import java.io.InputStream;public class AliOssUtil {private static final String ENDPOINT = "https://加上訪問(wèn)端口(https://oss-cn-hangzhou.aliyuncs.com)";private static final String ACCESS_KEY_ID = "ACCESS的id";private static final String SECRET_ACCESS_KEY = "ACCESS的secret";private static final String BUCKET_NAME = "自己的bucket名字";//上傳文件,返回文件的公網(wǎng)訪問(wèn)地址public static String uploadFile(String objectName, InputStream inputStream){// 創(chuàng)建OSSClient實(shí)例。OSS ossClient = new OSSClientBuilder().build(ENDPOINT,ACCESS_KEY_ID,SECRET_ACCESS_KEY);//公文訪問(wèn)地址String url = "";try {// 創(chuàng)建存儲(chǔ)空間。ossClient.createBucket(BUCKET_NAME);ossClient.putObject(BUCKET_NAME, objectName, inputStream);url = "https://"+BUCKET_NAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}return url;}
}