java.lang.ClassCastException: CommonsMultipartFile не может быть приведен к oracle.sql.BFILE - PullRequest
0 голосов
/ 18 августа 2011

Я работаю над экраном, который будет загружать файл в таблицу оракулов типа BFILE. Я использую spring3 и hibernate3.

Класс BO выглядит так:

@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;
}

}

Я определил BFILE userType:

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

Как это решить?

Решено:

Я пытался:

public void nullSafeSet (PreparedStatement st, значение объекта, int index) выдает HibernateException, SQLException { if (значение == ноль) { st.setObject (index, null); } 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);
    } 
}                                                                      

и работает нормально.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

java.lang.ClassCastException: org.springframework.web.multipart.commons.CommonsMultipartFile не может быть приведен к oracle.sql.BFILE

Это верно, два класса неЕсли вы не разделяете иерархию типов, нет возможности привести одну к другой.Вместо приведения типов вы должны сосредоточиться на передаче содержимого.

Это должен быть код, который вам нужен:

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

ОБНОВЛЕНИЕ: Оказывается, это не такэто так просто, как BFILE не может быть просто построен.Вот руководство по Oracle для работы с BFILES в Java .

1 голос
/ 18 августа 2011

CommonsMultipartFile представляет собой многочастный запрос формы, то есть набор полей.Вы должны извлечь ваш файл из поля, то есть позвонить getFileItem() или getInputStream(), чтобы извлечь содержимое файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...