经检查,是因为在 Integer 类型的字段上加了@NotBlank的校验注解,而该注解只能用于字符串类型,因此报类型不匹配异常
@NotBlank(message = "整季量不能为空") private Integer totalSeasonNum;
解决方法:用其@NotNull注解代替 Integer类型字段的校验
经检查,是因为在 Integer 类型的字段上加了@NotBlank的校验注解,而该注解只能用于字符串类型,因此报类型不匹配异常
@NotBlank(message = "整季量不能为空") private Integer totalSeasonNum;
解决方法:用其@NotNull注解代替 Integer类型字段的校验
首先 @EqualsAndHashCode 标在子类上
1. callSuper = true,根据子类自身的字段值和从父类继承的字段值 来生成hashcode,当两个子类对象比较时,只有子类对象的本身的字段值和继承父类的字段值都相同,equals方法的返回值是true。
2. callSuper = false,根据子类自身的字段值 来生成hashcode, 当两个子类对象比较时,只有子类对象的本身的字段值相同,父类字段值可以不同,equals方法的返回值是true。
package com.jt.test; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; /** * @Author: ldj * @Date: 2022/03/29/15:39 * @Description: */ public class HashCodeTest { public static void main(String[] args) { Cat cat1 = new Cat("黑色", "鲁鲁", 2); Cat cat2 = new Cat("白色", "鲁鲁", 2); System.out.println(cat1.equals(cat2)); //true callSuper = false System.out.println(cat1.equals(cat2)); //false callSuper = true } } @Data @NoArgsConstructor @AllArgsConstructor class Animal { private String color; } @Data @EqualsAndHashCode(callSuper = false) //排除父类字段 class Cat extends Animal { private String name; private Integer age; public Cat(String color, String name, Integer age) { super(color); this.name = name; this.age = age; } }
后续:Lombok 针对特定字段自定义get/set方法 ,排除@Data的覆盖问题
package com.atguli.common.demo; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; /** * User: ldj * Date: 2022/9/30 * Time: 21:47 * Description: * 结论: * @Getter(AccessLevel.NONE) User1不会生成getAge()方法 * 即便没有@Getter(AccessLevel.NONE),但手动重写了getAge, * 以重写后的为准 */ public class GetterDemo { public static void main(String[] args) { User1 ldj = new User1("ldj", 18); System.out.println(ldj); } } @Data @AllArgsConstructor class User1 { private String name; @Getter(AccessLevel.NONE) private Integer age; public Integer getAge() { return this.age * 100; } }
首先几乎在所有位置,long的小写和大写都可以互相替换。其次L本质是对象,不是基础类型,具有Object的特性。
包装类把基本类型转换为对象,每个基本类型在java.lang包中都有一个相应的包装类
包装类型: Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail
基本类型和包装类的异同
在Java中,一切皆对象,但八大基本类型却不是对象。
声明方式的不同,基本类型无需通过new关键字来创建,而封装类型需new关键字。
存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中。
初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false;
使用方式的不同:如与集合类合作使用时只能使用包装类型。
long类型最好以大写L来添加尾缀,因为小写l容易和数字1混淆。
1、@Data注解是lombok.jar包下的注解,该注解通常用在实体bean上,不需要写出set和get方法,但是具备实体bean所具备的方法,简化编程提高变成速度。
2、@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
使用@Data注解前
private String yhz; public String getYhz() { return yhz; } public void setYhz(String yhz) { this.yhz = yhz; }
使用@Data注解后
@Data public class Class { private String yhz; }
1、找到maven仓库lombok的jar包位置,或者在lombok官网(https://www.projectlombok.org/download)下载lombok的jar包
2、打开cmd ,运行javaw -jar lombok.jar (lombok的jar包全称)
3、点击Specify location…
,找到你的eclipse软件所在的目录,选择你的eclipse的exe文件
4、点击Install / Update即可安装lombok成功。重启eclipse并maven update一下项目。
@RestController注解初步理解
一、在Spring中@RestController的作用等同于@Controller + @ResponseBody。
所以想要理解@RestController注解就要先了解@Controller和@ResponseBody注解。
二、@Controller注解
在一个类上添加@Controller注解,表明了这个类是一个控制器类。但想要让这个类成为一个处理请求的处理器光有@Controller注解是不够的,他还需要进一步修炼才能成为一个处理器。
1.在spring容器中创建该类的实例。创建实例的方式有两种:
1
上述这种方式是在spring容器中注入单个bean,当项目比较大,控制器类比较多时,用这种方式向Spring容器中注入bean非常的让人苦恼,索性有第二种方式。
1
这种方式会扫描指定包中的所有类,并生成相应的bean注入到spring容器中。使用这种方式当然能够极大提高我们的开发效率,但是有时候我们不想某一类型的类注入到spring容器中。
这个时候第二种方式也可以解决。
<context:component-scan base-package=“test” >
<context:include-filter type=“annotation” expression=“org.springframework.stereotype.Service”/>
</context:component-scan>
上述代码表示扫描test包中除有@Service注解之外的类。
2.将@Controller注解的类注入Spring容器中,只是该类成为处理器的第一步,想要修炼大成,还需要在该类中添加注解@RequestMapping。
@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。
当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的;当没有使用@RequestMapping标记类时,方法的请求地址是绝对路径。
@RequestMapping的地址可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。也可以是通配符来筛选请求地址。具体的使用方法不是本次的重点,有兴趣的可以看
https://www.cnblogs.com/xiepeixing/p/4243288.html
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping("/users")
public String users() {
return “users”;
}
}
此时请求users方法的url路径就是:…/user/users。
可以看到上面users方法的返回值是字符串类型的,这个就是处理器在处理完任务后将要跳转的页面。如果想要方法直接返回结果,而不是跳转页面,这就要用到@ResponseBody注解了。
三、@ResponseBody注解
@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。
格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。
如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程。
理解@RestController过程中参考了下面这些博客,非常感谢
https://www.cnblogs.com/daimajun/p/7152970.html
https://blog.csdn.net/l358366885/article/details/79485497
https://blog.csdn.net/sunroyfcb/article/details/81048675
public static String format1(double value) { BigDecimal bd = new BigDecimal(value); bd = bd.setScale(2, RoundingMode.HALF_UP); return bd.toString(); }
public static String format3(double value) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); /* * setMinimumFractionDigits设置成2 * 如果不这么做,那么当value的值是100.00的时候返回100 * 而不是100.00 */ nf.setMinimumFractionDigits(2); /* * 如果想输出的格式用逗号隔开,可以设置成true */ nf.setGroupingUsed(false); return nf.format(value); }
public static String format3(double value) { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); /* * setMinimumFractionDigits设置成2 * 如果不这么做,那么当value的值是100.00的时候返回100 * 而不是100.00 */ nf.setMinimumFractionDigits(2); /* * 如果想输出的格式用逗号隔开,可以设置成true */ nf.setGroupingUsed(false); return nf.format(value); }
public static String format4(double value) { /* * %.2f % 表示 小数点前任意位数 2 表示两位小数 格式后的结果为 f 表示浮点型 */ return new Formatter().format("%.2f", value).toString(); }
public static String format6(double value) { long l =(long)(value*100) ; double d = l/100D; return String.valueOf(d); }
public static String format6(double value) { long l =(long)(value*100) ; double d = l/100D; return String.valueOf(d); }
首先 IDEA -plugins搜索插件GenerateAllSetter
安装后重启
使用方法
首先写一个 Object A = new Object();
然后 指针放到左边Object上,option + 回车
摘要 解决 Spring Boot 项目中,后端返回前端的结果出现中文乱码的问题。
这几天在使用 Spring Boot 学习AOP原理的时候,通过浏览器访问后端接口的时候,响应报文总是出现中文乱码问题,为了解决这个问题,这里给出两种解决方案。
方案一:properties文件中配置字符编码格式(强烈推荐)
properties文件中加入以下配置,强制指定Servlet编码格式为UTF-8:
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
方案二:注解@RequestMapping添加produces属性
在使用注解@RequestMapping、@GetMapping或者@PostMapping的时候,增加produces属性解决响应报文中文乱码问题:
@GetMapping(value =”/getResultById”, produces = “application/json; charset=utf-8”)
此方案需要在每个API上都添加说明,麻烦,强烈推荐简单而且方便的方案一。至此,完美解决了中文乱码问题
System.in的类型可以归结为节点流、字节流、输入流;
InputStreamReader这个对象是处理流,字符流,输入流;
BufferedReader的类型是缓冲处理流、字符流、输入流。
类 InputStreamReader是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。如:GBK
每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。 为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
System.in是个字节流
InputStreamReader是个字符流和字节流之间的转换中介
BufferedReader是个字符流
整体意思就是用InputStreamReader这个中介把System.in这个字节流转换成字符流BufferedReader
这样输入的时候就可以不是一个一个字节读,而是一个一个字符读,再加上是个Buffer,效率会高很多。
InputStream is = System.in;//键盘输入流
InputStreamReader isr = new InputStreamReader(is);//字节流转换为字符流
BufferedReader bufr = new BufferedReader(isr);//把字符流添加到缓冲流
用户通过reader对象的readLine方法来进行读取。
————————————————
版权声明:本文为CSDN博主「lzh_86」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lzh_86/article/details/78107597