1.for (Field field : fields) {
2. if (p.contains(field.getName())) {
3. if(field.getType().toString().split("[.]")[2].equals("String"))
4. callableStatement.setString(field.getName(), field.get(obj).toString());
5. else if(field.getType().toString().split("[.]")[2].equals("Integer"))
6. callableStatement.setInt(field.getName(), (int)field.get(obj));
7. System.out.println(field.get(obj).toString());
8. }
9.}
이것은 내 코드입니다. 리플렉션을 사용하여 클래스 객체에서 데이터를 가져오고 위 루프에서 프로 시저 입력에 대한 매개 변수를 설정합니다. 그러나, 어떤 정수 값을 저장하고이 값이 허용됩니다 7.반사 : 예외 java.lang.NullPointerException
라인 수에 일부 java.lang.NullPointerException
가 발생합니다 :
this.DI_StDate = Common.getDateStamp(date); // Integer
this.DI_StTime = Common.getTimeStamp(date); // Integer
Common.java에서
public static Integer getDateStamp(Date d) {
return Integer.parseInt(requiredDate.format(d));
}
public static Integer getTimeStamp(Date d) {
return Integer.parseInt(requiredTime.format(d));
}
여기에는 예외가 발생합니다 :
this.FileOpsId = new Integer(1); // Integer
this.FileTypeOpsId = 1; // Integer
내가 잘못하고있는 곳을 제안하십시오.
public class DIConnect {
public Integer PROC_ID;
public String APIKey;
public String Username;
public String pwd;
public String StreamKey;
public Integer DI_StDate;
public Integer DI_StTime;
public String FileNamePath;
public Integer FileOpsTypeId;
public String ConfigLabel;
public Integer FileOpsId;
public Integer End_Date;
public Integer End_Time;
public DIConnect(String FileNamePath, String ConfigLabel, Integer FileOpsTypeId, Integer StartDate, Integer StartTime) {
this.FileNamePath = FileNamePath;
this.ConfigLabel = ConfigLabel;
this.FileOpsTypeId = FileOpsTypeId;
this.DI_StDate = StartDate; // accepted
this.DI_StTime = StartTime; // accepted
this.FileOpsId = new Integer(1); // NOT ACCEPTED
}
}
이 main() 메소드의 호출입니다 :
이
내 클래스 회원입니다.DIConnect DIC = new DIConnect(filePath, "File", 1, Common.getDateStamp(date), Common.getTimeStamp(date));
DIC.InsertFileOperation();
DIConnect.java :
public Integer InsertFileOperation() {
String[] params = {"FileNamePath", "FileOpsId", "ConfigLabel", "DI_StDate", "DI_StTime"};
DatabaseOperation db = new DatabaseOperation();
if(db.openConnection()) {
this.PROC_ID = db.executeProcedure("sp_InsertIntoFileOpsMaster", params, this);
db.closeConnection();
}
return this.PROC_ID;
}
Database.java
public Integer executeProcedure(String proc, String[] params, Object obj) {
int Id = 0;
try {
String paramString = StringUtils.repeat("?, ", params.length + 1).trim();
paramString = paramString.substring(0, paramString.length() - 1);
proc = "{CALL " + proc + "(" + paramString + ")}";
callableStatement = conn.prepareCall(proc);
Class cls = obj.getClass();
Field[] fields = cls.getFields();
List<String> p = Arrays.asList(params);
for (Field field : fields) {
if (p.contains(field.getName())) {
if(field.getType().toString().split("[.]")[2].equals("String"))
callableStatement.setString(field.getName(), field.get(obj).toString());
else if(field.getType().toString().split("[.]")[2].equals("Integer"))
callableStatement.setInt(field.getName(), (int)field.get(obj));
System.out.println(field);
// System.out.println(field.get(obj).toString());
}
}
callableStatement.registerOutParameter("Id",java.sql.Types.INTEGER);
callableStatement.executeUpdate();
Id = callableStatement.getInt("Id");
} catch (SQLException | IllegalArgumentException | IllegalAccessException ex) {
Logger.getLogger(DatabaseOperation.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex){
System.out.println(ex.getMessage());
} finally {
return Id;
}
}
OUTPUT
public java.lang.Integer airteldemo.DIConnect.DI_StDate
public java.lang.Integer airteldemo.DIConnect.DI_StTime
public java.lang.String airteldemo.DIConnect.FileNamePath
public java.lang.String airteldemo.DIConnect.ConfigLabel
null
'필드'를 인쇄하려고하면 어떻게됩니까? – mok
'field.getName()'은 필드의 이름, 즉 FileOpsId와 FileTypeOpsId를 제공합니다. 또한,'(int) field.get (obj) .value'는 값을 제공합니다. –
그냥'field'를 출력 해주세요 : (System.out.print (field)) 예외를 얻은 행에서 정확히 결과가 무엇인지 확인하십시오. – mok