当前位置: 首页 > 后端技术 > Java

本周遇到的问题_0

时间:2023-04-01 14:13:48 Java

问题1我在写新模块的时候遇到这样一个问题——alternatecontactnumber是一个非必填字段,所以在验证的时候不需要添加Validators.required字段进行验证,但是因为是填写电话号码,需要验证电话号码是否符合规范,但是现有的验证电话号码的方法如果input为空,也会被验证为不符合规范,这也导致使用[disabled]="formGroup.invalid"判断保存按钮是否可用与实际计划不同——即备选联系电话成为必填字段。所以我做了以下尝试。一开始以为只需要这样订阅备用联系电话,有内容的时候加验证,没有内容的时候取消验证就可以了。this.formGroup.get(this.formKeys.alternatePhone).valueChanges.subscribe((value)=>{if(value){constalternatePhoneFormControl=newFormControl(value,YzValidators.isChinaMobileNumber);this.formGroup.setControl(this.formKeys.alternatePhone,alternatePhoneFormControl);}else{constnewAlternatePhoneFormControl=newFormControl(value);this.formGroup.setControl(this.formKeys.alternatePhone,newAlternatePhoneFormControl);}})但在这种情况下,订阅部分的代码只会进入dataforthefirsttime每次都会执行一次,后面有变化就不执行了。我个人的猜测是,虽然这是通过setControl()来改变订阅的formControl,但是订阅关系是不会改变的,也就是说,这相当于新建了一个formControl。订阅的formControl与之前的formCommtrol相比还是有所变化。然后我想尝试直接订阅整个formGroup的变化来实现需要的需求this.formGroup.get(this.formKeys.alternatePhone).valueChanges.subscribe((value)=>{if(value){constalternatePhoneFormControl=newFormControl(value,YzValidators.isChinaMobileNumber);this.formGroup.setControl(this.formKeys.alternatePhone,alternatePhoneFormControl);}else{constnewAlternatePhoneFormControl=newFormControl(value,YzValidators.isChinaMobileNumber);this.formGroup.setControl(this.formKeys.alternatePhone,newAlternatePhoneFormControl);}})但这显然是错误的,setControl()也改变了formGroup,从而导致死循环。最后,我尝试将订阅方法分开。我们设置好formControl之后,再去订阅我们设置的formControl,从而达到目的。ngOnInit():void{this.initFormGroup();this.subscribeAlternatePhoneChange(this.formGroup.get(this.formKeys.alternatePhone))}subscribeAlternatePhoneChange(formControl:AbstractControl):void{formControl.valueChanges.subscribe((value)=>{console.log(value);if(value){constalternatePhoneFormControl=newFormControl(value,YzValidators.isChinaMobileNumber);this.formGroup.setControl(this.formKeys.alternatePhone,alternatePhoneFormControl);this.subscribeAlternatePhoneChange(alternatePhoneFormControl);}else{constnewAlternatePhoneFormControl=newFormControl(value);这。subscribeAlternatePhoneChange(newAlternatePhoneFormControl);this.formGroup.setControl(this.formKeys.alternatePhone,newAlternatePhoneFormControl);}})}问题2@JsonView在当前项目的后台使用@JsonView使用很频繁,所以简单了解了一下@JsonView的使用。我个人认为@JsonView的作用是根据自己的需要过滤后台返回给前台的Json数据。比如我们有一个teacher实体,里面有name.username,email等字段,但是我们只想在前台显示name字段,所以返回的json数据中不应包含其他字段数据。这时候我们就可以使用@Jsonview来达到目的。私有字符串用户名;私人字符串电子邮件;...公共接口NameJsonView{}@GetMapping@JsonView(PageJsonView.class)publicListgetAll(){return(List)teacherService.getAll();}。..publicstaticclassPageJsonViewimplementsTeacher.NameJsonView{}这种情况下,前台只接收name的json数据。但是这种过滤是单向的。比如我们从前台发送name、email、username等数据,按照上面的方法在C层的save方法中添加@JsonView(PageJsonView.class),实际的数据是不会传递的.过滤掉,数据还是会传到后台,保存在数据库中。而且值得一提的是,如果在关联对象上使用@JsonView,会出现如下情况。比如我们在类实体@JsonView(TeacherJsonView.class)@ManyToOneprivateTeacher老师中为老师设置jsonView;...公共接口TeacherJsonView{}@GetMapping@JsonView(Klass.TeacherJsonView.class)publicListgetAll(@RequestParamStringname){returnthis.klassService.getAll(name);}那么返回给前台的数据就是[{"teacher":{}}]一个空老师。如果我们要显示teacherName的数据,需要@GetMapping@JsonView(Teacher.NameJsonView.class)publicListgetAll(@RequestParamStringname){returnthis.klassService.getAll(name);}返回到前台数据[{"teacher":{"name":"李四"}}]后,我测试了是否给实体的某个字段加上@JsonView注解,然后调用page()方法使用一个没有实现任何JsonView接口的类的方法观察返回值的情况。@JsonView(NameJsonView.class)私有字符串名称;私有布尔性;私有字符串用户名;私人字符串电子邮件;私有长创建时间;私人长更新时间;@GetMapping@CrossOrigin("*")@JsonView(NullJsonView.class)publicListgetAll(){logger.info("gerAll");/*定义查询字符串*/return(List)teacherService.getAll();}。返回结果[{}]与预期结果一致,但是如果我们的page方法没有使用@JsonView注解而是在entity中使用了@JsonView注解,那么就不会发生过滤,返回正常结果[{"id":6,"name":"123","sex":false,"username":"123","email":"123","createTime":null,"updateTime":null,"删除":false,"password":"yunzhi"}]但是如果我们尝试在Teacher实体上使用@JsonView注解@JsonView(Teacher.TeacherJsonView.class)publicclassTeacher{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;@JsonView(NameJsonView.class)私有字符串名称;私有布尔性;私有字符串用户名;@JsonView(EmailJsonView.class)私人字符串电子邮件;私有长创建时间;私人长更新时间;protectedBooleandeleted=false;privateStringpassword="yunzhi";...publicinterfaceTeacherJsonView{}}publicstaticclassPageJsonViewimplementsTeacher.TeacherJsonView{}则返回结果如下[{"id":6,"sex":false,"username":"123","createTime":null"updateTime":null,"deleted":false,"password":"yunzhi"}]我们会发现只有name和email没有发给前台,因为他们也加了@JsonView注解,如果你想它们要回到前台,需要实现它们对应的接口如下publicstaticclassPageJsonViewimplementsTeacher.TeacherJsonView,Teacher.NameJsonView,Teacher.EmailJsonView{}此时我们View返回的数据就是Teacher的所有数据[{"id":6,"姓名":"123","sex":false,"username":"123","email":"123","createTime":null,"updateTime":null,"deleted":false,"password":"yunzhi"}]问题3项目中很多实体都会有这样一个注解@SQLDelete(sql="update`entity_name`setdeleted=1whereid=?")经过查找,发现在项目开发中,数据库的删除一般都是逻辑删除,可以很好的保持数据的完整性。在sql中写删除时的sql语句。当调用delete方法时,hibernate会自动执行该语句实现软删除,即数据还在数据库中,只是将deleted字段设置为true。通常与@Where注解一起使用,例如:@SQLDelete(sql="update`teacher`setdeleted=1whereid=?")@Where(clause="deleted=false")当我们要查询这块时data也会返回null,表示数据已经被删除。@Where表示在执行hibernate查询操作时,会在sql的where后面自动添加一个条件deleted=false;但通常我们不会直接在实体上使用@Where注解,比如我们有一个通过classes查询学生的页面,我们可以在class实体中对student字段进行操作@OneToMany(mappedBy="klass")@Where(clause="deleted=false")privateList学生;这实现了我们想要的