-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: org.hibernate.PropertyAccessException on setting value
PostPosted: Mon Jul 04, 2011 8:14 am 
Newbie

Joined: Mon Jul 04, 2011 7:57 am
Posts: 2
Hi all,

I'm faceing strange error while mapping DB object to the Entity. There is my entity:
BankAuthenticationSystem.java
Code:
@Entity
@Table(name = "LGN2_BANK_SYSTEMS")
@Immutable
@Where(clause = "current_date between BS_VALID_FROM and coalesce(BS_VALID_TO, current_date)")
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@TypeDefs({
        @TypeDef(name = "certificate-type", typeClass = CertificateType.class),
        @TypeDef(name = "keypair-type", typeClass = KeyPairType.class)
})
public class BankAuthenticationSystem implements AuthentificationSystem {
    ...
    ...

    @Column(name = "BS_CERTIFICATE", nullable = false)
    @Type(type = "certificate-type")
    @Lob
    private X509Certificate certificate;
   
    ...
    ...
    //no any setters for certificate
    public X509Certificate getCertificate() {
        return certificate;
    }

    ...
}


Entity contains X509Certificate certificate (of java.security.cert.X509Certificate type). I'm using custom type mapping called "certificate-type":

CertificateType.java
Code:
public class CertificateType implements CompositeUserType {
    private static final Logger log = Logger.getLogger(CertificateType.class);

    private static final String[] propertyNames = {"certificate"};
    private static final Type[] propetyTypes = {StandardBasicTypes.BLOB};

    @Override
    public String[] getPropertyNames() {
        return propertyNames;
    }

    @Override
    public Type[] getPropertyTypes() {
        return propetyTypes;
    }

    @Override
    public Object getPropertyValue(Object o, int i) throws HibernateException {
        log.info("getPropertyValue()");
        log.info("o [" + o + "]");
        log.info("i [" + i + "]");

        X509Certificate value = (X509Certificate) o;

        try {
            return value.getEncoded();
        } catch (CertificateEncodingException e) {
            throw new HibernateException(e);
        }
    }

    @Override
    public void setPropertyValue(Object o, int i, Object o1) throws HibernateException {
        log.info("setPropertyValue()");
        log.info("o [" + o + "]");
        log.info("i [" + i + "]");
        log.info("o1 [" + o1 + "]");

        X509Certificate result = (X509Certificate) o;

        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", "BC");

            BLOB data = (BLOB) o1;
            InputStream is = data.getBinaryStream();

            result = (X509Certificate) certificateFactory.generateCertificate(is);
        } catch (CertificateException e) {
            throw new HibernateException(e);
        } catch (NoSuchProviderException e) {
            throw new HibernateException(e);
        } catch (SQLException e) {
            throw new HibernateException(e);
        }
    }

    @Override
    public Class returnedClass() {
        return X509Certificate.class;
    }

    @Override
    public boolean equals(Object o, Object o1) throws HibernateException {
        boolean result = false;

        if (o == o1) {
            result = true;
        } else if (o != null && o1 != null) {
            result = o.equals(o1);
        }

        return result;
    }

    @Override
    public int hashCode(Object o) throws HibernateException {
        return o.hashCode();
    }

    @Override
    public Object nullSafeGet(ResultSet resultSet, String[] strings, SessionImplementor sessionImplementor, Object o) throws HibernateException, SQLException {
        log.info("nullSafeGet()");
        log.info("strings [" + strings + "]");
        log.info("sessionImplementor [" + sessionImplementor + "]");
        log.info("o [" + o + "]");

        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", "BC");

            BLOB data = (BLOB) resultSet.getBlob(strings[0]);

            InputStream is = data.getBinaryStream();

            return certificateFactory.generateCertificate(is);
        } catch (CertificateException e) {
            throw new HibernateException(e);
        } catch (NoSuchProviderException e) {
            throw new HibernateException(e);
        }
    }

    @Override
    public void nullSafeSet(PreparedStatement preparedStatement, Object o, int i, SessionImplementor sessionImplementor) throws HibernateException, SQLException {
        log.info("nullSafeSet()");
        log.info("o [" + o + "]");
        log.info("i [" + i + "]");
        log.info("sessionImplementor [" + sessionImplementor + "]");

        if (o == null) {
            preparedStatement.setNull(i, StandardBasicTypes.BLOB.sqlType());
        } else {
            X509Certificate data = (X509Certificate) o;

            try {
                InputStream is = new ByteArrayInputStream(data.getEncoded());
                preparedStatement.setBlob(i, is);
            } catch (CertificateEncodingException e) {
                throw new HibernateException(e);
            }
        }
    }

    @Override
    public Object deepCopy(Object o) throws HibernateException {
        return o;
    }


    @Override
    public boolean isMutable() {
        return true;
    }

    @Override
    public Serializable disassemble(Object o, SessionImplementor sessionImplementor) throws HibernateException {
        return (Serializable) deepCopy(o);
    }

    @Override
    public Object assemble(Serializable serializable, SessionImplementor sessionImplementor, Object o) throws HibernateException {
        return deepCopy(o);
    }

    @Override
    public Object replace(Object o, Object o1, SessionImplementor sessionImplementor, Object o2) throws HibernateException {
        return o;
    }
}


So while executing application fisrt time everithing isworking correctly. But on the next refresh I'm getting following error:
Code:
org.hibernate.PropertyAccessException: could not set a field value by reflection setter of lt.emc.sodra.login.domain.authentication.BankAuthenticationSystem.certificate
   org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:151)
   org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:583)
   org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:229)
   org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3847)
   org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:137)
   org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:104)
   org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:651)
   org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:605)
   org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:459)
   org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227)
   org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285)
   org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
   org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090)
   org.hibernate.impl.SessionImpl.get(SessionImpl.java:1005)
   org.hibernate.impl.SessionImpl.get(SessionImpl.java:998)
   lt.emc.sodra.login.service.impl.LoginServiceImpl.getBankAuthentificationSystemById(LoginServiceImpl.java:125)
   lt.emc.sodra.login.service.impl.LoginServiceImpl.getAuthentificationSystemByIdAndType(LoginServiceImpl.java:230)
   sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source)
   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   java.lang.reflect.Method.invoke(Method.java:597)
   org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
   org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
   $Proxy39.getAuthentificationSystemByIdAndType(Unknown Source)
   lt.emc.sodra.login.taglib.MenuElement.doTag(MenuElement.java:62)
   org.apache.jsp.WEB_002dINF.views.list_jsp._jspx_meth_login_005flink_005f0(list_jsp.java:230)
   org.apache.jsp.WEB_002dINF.views.list_jsp._jspService(list_jsp.java:81)
   org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
   org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
   org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
   org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
   org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
   org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
   org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
   org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


As I understand hibernate incorrectly reflecting object, but why?

If it usefull attaching full stacktrace:
Code:
Stacktrace:
   at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
   at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
   at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
   at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
   at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
   at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
   at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
   at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
   at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
   at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
   at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
   at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
   at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
   at java.lang.Thread.run(Thread.java:619)
Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspException: lt.emc.sodra.login.exception.LoginServiceException: Nepavyko apdoroti duomen? objekto
   at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
   at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
   at org.apache.jsp.WEB_002dINF.views.list_jsp._jspService(list_jsp.java:184)
   at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
   ... 34 more
Caused by: lt.emc.sodra.login.exception.LoginServiceException: Nepavyko apdoroti duomen? objekto
   at lt.emc.sodra.login.service.impl.LoginServiceImpl.getBankAuthentificationSystemById(LoginServiceImpl.java:127)
   at lt.emc.sodra.login.service.impl.LoginServiceImpl.getAuthentificationSystemByIdAndType(LoginServiceImpl.java:230)
   at sun.reflect.GeneratedMethodAccessor29.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
   at $Proxy39.getAuthentificationSystemByIdAndType(Unknown Source)
   at lt.emc.sodra.login.taglib.MenuElement.doTag(MenuElement.java:62)
   at org.apache.jsp.WEB_002dINF.views.list_jsp._jspx_meth_login_005flink_005f0(list_jsp.java:230)
   at org.apache.jsp.WEB_002dINF.views.list_jsp._jspService(list_jsp.java:81)
   ... 37 more
Caused by: org.hibernate.PropertyAccessException: could not set a field value by reflection setter of lt.emc.sodra.login.domain.authentication.BankAuthenticationSystem.certificate
   at org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:151)
   at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:583)
   at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:229)
   at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3847)
   at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:137)
   at org.hibernate.cache.entry.CacheEntry.assemble(CacheEntry.java:104)
   at org.hibernate.event.def.DefaultLoadEventListener.assembleCacheEntry(DefaultLoadEventListener.java:651)
   at org.hibernate.event.def.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:605)
   at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:459)
   at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227)
   at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285)
   at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
   at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090)
   at org.hibernate.impl.SessionImpl.get(SessionImpl.java:1005)
   at org.hibernate.impl.SessionImpl.get(SessionImpl.java:998)
   at lt.emc.sodra.login.service.impl.LoginServiceImpl.getBankAuthentificationSystemById(LoginServiceImpl.java:125)
   ... 47 more
Caused by: java.lang.IllegalArgumentException: Can not set java.security.cert.X509Certificate field lt.emc.sodra.login.domain.authentication.BankAuthenticationSystem.certificate to lt.emc.sodra.login.domain.authentication.BankAuthenticationSystem
   at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
   at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
   at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
   at java.lang.reflect.Field.set(Field.java:657)
   at org.hibernate.property.DirectPropertyAccessor$DirectSetter.set(DirectPropertyAccessor.java:139)
   ... 62 more


Using hibernate version 3.6.4.Final with following config:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="sodraLoginDatasource"/>
        <property name="packagesToScan" value="..."/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="cache.use_query_cache">true</prop>
                <prop key="cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
                <prop key="hibernate.cache.use_structured_entries">true</prop>
                <prop key="net.sf.ehcache.configurationResourceName">/META-INF/ehcache/ehcache.xml</prop>
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
</beans>


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.