我无法使用import { Injectable } from '@angular/core';
import { adal } from 'adal-angular';
import { Observable, Subscriber } from 'rxjs';
import { retry } from 'rxjs/operators';
import { AdalConfigService } from './adal-config.service';
declare var AuthenticationContext: adal.AuthenticationContextStatic;
let createAuthContextFn: adal.AuthenticationContextStatic = AuthenticationContext;
@Injectable({
providedIn: 'root',
})
export class AdalService {
private context: adal.AuthenticationContext;
constructor(private configService: AdalConfigService) {
this.context = new createAuthContextFn(configService.adalSettings);
}
从类中获得带下划线(例如User_Name)的属性,它总是抛出错误:
“类'User'上的未知属性'User_Name'”。
但是当我调试bean时,它具有User_Name属性。
BeanUtils.getProperty(bean, property)
User类是
BeanUtils.getProperty(bean, propertyName);
答案 0 :(得分:1)
这是命名约定的问题。您可以参考Where is the JavaBean property naming convention defined?进行参考。来自JavaBeans API specification
的8.8节... 因此,当我们从现有Java名称的中间提取属性或事件名称时,通常会将第一个字符转换为小写 * case 1 。但是要支持偶尔使用所有 大写的名称,我们检查名称的前两个字符 * case 2 是否均为大写,以及 所以不要管它。例如,
“ FooBah”成为“ fooBah”
'Z'变成'z'
“ URL”变为“ URL”我们提供了Introspector.decapitalize方法,该方法实现了此转换规则
因此,对于您给定的班级,该属性是根据getUser_Name()
和setUser_Name()
推导出来的
根据* case1是“ user_Name”而不是“ User_Name”。并根据* case 2来调用getProperty(bean, "ID")
。
要解决此问题,请根据Java命名约定更新命名,我们应以小写字母开头的属性和方法,并使用 camelCase 代替 snake_case 分隔单词。请记住,遵循约定在编程中确实很重要。下面以更新的类为例。
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanUtils;
public class User {
private String ID;
private String userName;
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public static void main(String[] args)
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
User bean = new User();
bean.setUserName("name");
System.out.println(BeanUtils.getProperty(bean, "userName"));
}
}