2016-03-02 53 views
1

我正在开发一个Java Web应用程序使用Hibernate和Spring。我定义Enum如下:未知序号值[46]对于枚举类错误与休眠

public enum FeatureType implements ParentEnumInterface{ 

    VAL0(0, "VAL0"), VAL1(1, "VAL1"), VAL2(2, "VAL2"), VAL3(3, "VAL3"), VAL4(4, "VAL4"), VAL5(5, "VAL5"), 
    ... 
    VAL43(43, "VAL43"), VAL44(44, "VAL44"), VAL45(45, "VAL45"), VAL46(46, "VAL46"); 

    private String translate; 
    private FeatureType(int ordinal, String translate) 
    { 
     this.translate = translate; 
     setEnumOrdinal(this, ordinal); 
    } 

    public String getName() 
    { 
     return name(); 
    } 

    private static void setEnumOrdinal(Enum object, int ordinal){ 
     Field field; 
     try{ 
      field = object.getClass().getSuperclass().getDeclaredField("ordinal"); 
      field.setAccessible(true); 
      field.set(object, ordinal); 

     }catch(Exception ex){ 
      throw new RuntimeException("cannot update enum ordinal", ex); 
     } 
    } 
    public String getTranslate() 
    { 
     return translate; 
    } 


} 

因为我有非常featureType并有可能我删除其中的一些在开发的时候,我定义ordinal所有featureType

我用FeatureType枚举在我的实体如下:

public class MetaData implements Serializable{ 
    @Id 
    @GeneratedValue 
    private Long Id; 

    private FeatureType featureType; 

    // Getters And Setters 
} 

我的应用程序完美的作品,只要FeatureType成员都小于46。然而,当我添加了47件,如下发生错误:

enter image description here

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Unknown ordinal value [46] for enum class [ir.javan.calk.enums.FeatureType] 

type Exception report 

message Request processing failed; nested exception is java.lang.IllegalArgumentException: Unknown ordinal value [46] for enum class [ir.javan.calk.enums.FeatureType] 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Unknown ordinal value [46] for enum class [ir.javan.calk.enums.FeatureType] 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:155) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
    ir.javan.calk.util.SimpleCorsFilter.doFilter(SimpleCorsFilter.java:36) 
root cause 

java.lang.IllegalArgumentException: Unknown ordinal value [46] for enum class [ir.javan.calk.enums.FeatureType] 
    org.hibernate.type.EnumType$OrdinalEnumValueMapper.fromOrdinal(EnumType.java:391) 
    org.hibernate.type.EnumType$OrdinalEnumValueMapper.getValue(EnumType.java:381) 
    org.hibernate.type.EnumType.nullSafeGet(EnumType.java:107) 
    org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127) 
    org.hibernate.type.AbstractType.hydrate(AbstractType.java:106) 
    org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2924) 
    org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1695) 
    org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1627) 
    org.hibernate.loader.Loader.getRow(Loader.java:1509) 
    org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:719) 
    org.hibernate.loader.Loader.processResultSet(Loader.java:949) 
    org.hibernate.loader.Loader.doQuery(Loader.java:917) 
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:348) 
    org.hibernate.loader.Loader.doList(Loader.java:2550) 
    org.hibernate.loader.Loader.doList(Loader.java:2536) 
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2366) 
    org.hibernate.loader.Loader.list(Loader.java:2361) 
    org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:124) 
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1623) 
    org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:374) 
    org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:396) 
    ir.javan.calk.dao.MetadataDaoImpl.getMetadata(MetadataDaoImpl.java:45) 
    ir.javan.calk.service.MetadataServiceImpl.getDescribeFeatureType(MetadataServiceImpl.java:61) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:483) 
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    com.sun.proxy.$Proxy664.getDescribeFeatureType(Unknown Source) 
    ir.javan.calk.controller.MetadataController.getDescribeFeatureType(MetadataController.java:42) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:483) 
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:155) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
    ir.javan.calk.util.SimpleCorsFilter.doFilter(SimpleCorsFilter.java:36) 
note The full stack trace of the root cause is available in the Apache Tomcat/8.0.27 logs. 

Apache Tomcat/8.0.27 

什么问题?

+0

这只是一个客串,也许是modifiing序不是一个好主意。 – Ralph

+0

我按照[这里]使用这种方式(http://stackoverflow.com/questions/19449334) –

回答

3

首先让我说点什么:我相信它是的(让我表达它友好)一个不太好的主意来操纵枚举序列!


我想这个问题是,你必须在枚举序差距。你用这个ordnials来映射他们的休眠状态。所以Hibernate使用OrdinalEnumValueMapper。通过此映射器所使用的代码是:

private Enum fromOrdinal(int ordinal) { 
    final Enum[] enumsByOrdinal = enumsByOrdinal(); 
    if (ordinal < 0 || ordinal >= enumsByOrdinal.length) { 
     throw new IllegalArgumentException(
       String.format("Unknown ordinal value [%s] for enum class [%s]", ordinal,enumClass.getName())); 
    } 
    return enumsByOrdinal[ordinal]; 
} 

private Enum[] enumsByOrdinal() { 
     if (enumsByOrdinal == null) { 
      enumsByOrdinal = enumClass.getEnumConstants(); 
      ... 
     } 
     return enumsByOrdinal; 
} 

你注意到,此代码由T[] getEnumConstants()(的Class的方法)获得的枚举值的列表中的阵列,然后在序的位置访问该阵列。但是你改变了原来的东西,所以它会访问王的价值。 - 如果你幸运的话,它会尝试访问一个不在数组中的索引,并且发生异常,它有一个糟糕的一天,它会发现在该索引处有一个值,但它可能是错误的(因为的差距)。

解决方法:取出序maniulation和使用@Enumarated(value=EnumType.STRING)代替