Hi all,
I'm faceing strange error while mapping DB object to the Entity. There is my entity:
BankAuthenticationSystem.javaCode:
@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.javaCode:
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>