使用Hibernate的枚举类错误的未知序数值[46]

时间:2016-03-02 07:22:48

标签: java spring hibernate enums

我正在使用Hibernate和Spring开发Java Web App。我将Enum定义如下:

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 } Enum,如下所示:

FeatureType

只要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 成员小于46,我的应用程序就可以正常运行。但是,当我添加第47个成员时,会发生如下错误:

enter image description here

UITapGesture

有什么问题?

1 个答案:

答案 0 :(得分:3)

首先让我说一句:我相信它是(让我表达友好)一个不太好的想法来操纵enum全数!

我猜问题是你在枚举中有一个缺口。你用ordnials用hibernate映射它们。所以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的方法)获取数组中的枚举值列表,然后在序号位置访问该数组。但是你改变了ORDINAL,所以它将访问wong值。 - 如果你很幸运,它将尝试访问一个不在数组中的索引并且发生异常,你有一个糟糕的一天,它会发现在该索引处有一个值,但那么它可能是错误的一个(因为差距)。

解决方案:删除序数式拼写并改为使用@Enumarated(value=EnumType.STRING)