app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
}),
);
import { IsNotEmpty, IsString } from 'class-validator';
export class SignupUserDto {
@IsString()
@IsNotEmpty()
username: string;
password?: string;
}
上面的password是非必填,按照上面的写法,如果填了password,controller中拿不到password的值。
只有加上一个注解才可以。加上注解如果不传,又会提示password必须是字符串,怎么搞?
没太理解你的需求,你开启了 whitelist
不就是主动丢弃了没加装饰器的字段了?但是你还不想丢弃?那你干嘛要开启它呢?
非要这么拧巴的话那你就也加个装饰器,同时指定仅当字段不为空时才验证吧:
import { ValidateIf, IsString } from 'class-validator';
@ValidateIf(dto => dto.password != null)
@IsString()
password?: string;
也可以写成:
import { IsOptional, IsString } from 'class-validator';
@IsOptional()
@IsString()
password?: string;
https://github.com/typestack/class-validator#validation-decorators
两者是等效的。
问题内容: 我有一个带有一个可选字段的对象,找不到合适的注释来对其建模。有什么想法和Jackson一起做的正确方法是什么? 问题答案: 在Jackson中,您无法区分可选字段和非可选字段。只需在您的POJO中声明任何字段即可。如果您的JSON结构中没有字段,那么Jackson将不会调用setter。您可以跟踪在POJO中是否用标志调用了setter。
问题内容: 我想使用自定义功能对a进行序列化和反序列化,但是Serde的书没有涵盖此功能,并且代码文档也无济于事。 我知道Serde可以很容易地反序列化,因为Chrono支持Serde, 但是 我想学习Serde,所以我想自己实现。当我运行此代码时,出现错误: 问题答案: 结构反序列化的默认行为是,当字段不以序列化形式出现时,为其分配各自的默认值。请注意,这与container 属性 不同,con
我有一节这样的课 我希望属性是可选的。如何在Java中实现这一点? 在某些语言中,它非常优雅和简单,我们只需在字段名后附加一个问号。
问题内容: 我很难理解net模块的几个Node.js示例中显示的功能。 任何人都可以提供有关其工作原理以及为什么需要这样做的解释吗? 问题答案: 该功能从可读流中读取可用的数据,并将其写入目标可写流。 文档中的示例是回显服务器,它是发送接收到的信息的服务器。该对象同时实现了可读和可写的流接口,因此它会将接收到的所有数据写回套接字。 这等效于使用使用事件侦听器的方法:
正确地注入了值。但是,变量必须是可选的,它作为命令行参数传入(然后使用SimpleCommandLinePropertySource将其添加到Spring上下文中),并且这个参数并不总是存在。 为了提供默认值,我尝试了以下两种方法: 但是在每种情况下,冒号后面的默认参数都被注入,即使存在实际值--这似乎覆盖了Spring应该注入的内容。
问题内容: 快速使用以下语法进行流控制 在这种情况下 ,真值上下文的语义是什么 ? 是否允许 表达式链接 (如下所示)? 如果是这样,布尔表达式是否会短路? 问题答案: 首先检查它是否为零或是否有数据。如果为零,则不会执行if语句。如果有数据,则将数据解包并分配给if语句的范围。然后执行括号内的代码。 无法在一个if语句中链接此功能。不直接评估为布尔值。最好将“ if let”视为一个特殊关键字。