2011-08-18 9 views
0

BFILE 유형으로 Oracle 테이블에 파일을 업로드하는 화면에서 작업 중입니다. 나는 spring3과 hibernate3을 사용하고있다.java.lang.ClassCastException : CommonsMultipartFile을 oracle.sql.BFILE로 캐스팅 할 수 없음

처럼 BO 클래스보기 : 나는 BFILE 유저 유형을 정의

@Entity 
@Table(name="abc_manuals") 
public class ManualBo implements Serializable { 

/* Persistent Fields */ 
@Id 
@Column(name="id", nullable=false) 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long mId; 


@Column(name="guide") 
@Type(type="com.bo.entity.BFILEType") 
private BFILE guide; 


public Long getMlId() { 
    return mlId; 
} 
public void setMId(Long manualId) { 
    this.mId = mId; 
} 

public BFILE getGuide() { 
    return guide; 
} 
public void setGuide(BFILE guide) { 
    guide = guide; 
} 

} 

: 나는 컨트롤러 setFile에 노력하고 때

public class BFILEType implements UserType, Serializable { 

@SuppressWarnings("unused") 
private static final String MARK_EMPTY = "<EmptyString/>"; 
private static final int[] TYPES = { OracleTypes.BFILE }; 

public int[] sqlTypes() { 
    return TYPES; 
} 

@SuppressWarnings("rawtypes") 
public Class returnedClass() { 
    return BFILE.class; 
} 

public boolean equals(Object x, Object y) { 
    if (x==y) return true; 
    if (x==null || y==null) return false; 
    return x.equals(y); 
} 

public Object deepCopy(Object x) { 
    return x; 
} 

public boolean isMutable() { return false; } 

    public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws 
    HibernateException, SQLException { 
    BFILE bfile = (BFILE)rs.getObject(names[0]); 
    return bfile; 
} 

public void nullSafeSet(PreparedStatement st, Object value, int index) throws 
    HibernateException, SQLException { 
    if(value==null) 
     st.setObject(index, null); 
    else 
     st.setObject(index, value, OracleTypes.BFILE); 
} 

public Object assemble(Serializable arg0, Object arg1) throws HibernateException { 
    return deepCopy(arg0); 
} 

public Serializable disassemble(Object value) { 
    return (Serializable) deepCopy(value); 
} 

public int hashCode(Object arg0) throws HibernateException { 
    return arg0.hashCode(); 
} 

public Object replace(Object arg0, Object arg1, Object arg2) throws 
    HibernateException { 
    return deepCopy(arg0); 
} 

}

문제입니다

manual.setGuide ((oracle.sql.BFILE) form.getFile());

이 아니라 컴파일하지만 화면에서 파일을 업로드 할 때 다음과 같은 예외를

java.lang.ClassCastException가을주고있다 : org.springframework.web.multipart.commons합니다. CommonsMultipartFile을 oracle.sql로 캐스팅 할 수 없습니다. BFILE

어떻게 해결할 수 있습니까?

는 해결 :

내가 시도 :

공공 무효 nullSafeSet (PreparedStatement의 일, 개체 값 INT 지수) HibernateException이,되는 SQLException { 경우 (값 == null이)를 던졌습니다 { st.setObject (인덱스 , 없는); } else {

 OracleConnection oc = (OracleConnection) st.getConnection(); 
     OraclePreparedStatement opst = (OraclePreparedStatement) st; 

     OracleCallableStatement ocs = (OracleCallableStatement) oc.prepareCall("{? = call BFILENAME('" + directory + "', '"+ filename + "')}"); 

     ocs.registerOutParameter(1, OracleTypes.BFILE); 
     ocs.execute(); 
     BFILE bfile = ocs.getBFILE(1); 
     opst.setBFILE(index, bfile); 
    } 
}                  

및 그 잘 동작합니다.

감사합니다.

+0

BFILE이 실제로 여기에있는 것이 확실합니까? 일반적으로 BFILE 열은 물리적으로 데이터베이스 서버 (또는 데이터베이스 서버에 액세스 할 수있는 공유/파일 시스템)에있는 파일로 채워집니다.보다 일반적인 방법은 BLOB 열을 사용하여 이러한 방식으로 수신 된 파일을 저장하는 것입니다. – pap

답변

1

CommonsMultipartFile은 멀티 파트 양식 요청, 즉 필드 모음을 나타냅니다. 파일 내용을 추출하려면 필드에서 파일을 추출해야합니다 (예 : getFileItem() 또는 getInputStream()).

+0

getFileItem() 메소드는 MultipartFile 유형에 대해 정의되어 있지 않으므로 두 번째 시도가 필요합니다. manual.setGuide ((oracle.sql.BFILE) form.getFile(). getInputStream()); (inputStream) – Jyoti

+0

@Jyoti 다시, InputStream과 CommonsMultiPartFile은 타입 계층 구조를 공유하지 않으므로 형 변환이 불가능합니다 (I 'd 'd Java 튜토리얼의 [상속] (http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html) 섹션을 읽어 보시기 바랍니다. 그러나 InputStream은 2 진 데이터의 공통 교환 형식입니다. –

2

java.lang.ClassCastException가 : org.springframework.web.multipart.commons.CommonsMultipartFile이 oracle.sql.BFILE 올바른

에 캐스트 할 수없는 수, 두 클래스는하지 유형 계층 구조를 공유하기 때문에 다른 유형으로 변환 할 수 없습니다. 유형을 형 변환하는 대신 내용을 전송하는 데 집중해야합니다.

이 당신이 필요로하는 코드가 있어야한다 :

BFILE bfile = new BFILE(); 
bfile.setBytes(form.getFile().getBytes()); 
manual.setGuide(bfile); 

UPDATE : 그것은 BFILE 단지를 구축 할 수 없었던 것처럼, 그건 쉬운 일이 아닙니다 밝혀졌습니다. 여기에 Oracle tutorial for working with BFILES in Java이 있습니다.

+0

감사! 그러나 BFILE (BFILE bfile = new BFILE();)을 인스턴스화 할 수 없습니다. 오류가 발생했습니다 : 생성자 BFILE()이 보이지 않습니다. – Jyoti

관련 문제