2014-09-03 1 views
1

После миграции из Grails 2.2.4 в 2.4.3 класс домена с свойством с именем applicationContext выдает исключения при использовании этого свойства в запросах критериев.Запрещено использовать 'applicationContext' в качестве имени свойства домена в Grails 2.4.3?

class WebResource { 
    String applicationContext 
} 

class ResourceService { 
    public WebResource getResourceByContext(String ctx) { 
    WebResource.withCriteria() { 
     eq('applicationContext', ctx) 
    } 
    } 
} 

Вызов getResourceByContext() бросает исключение:

 
    org.hibernate.QueryException: could not resolve property: applicationContext of: org.mydomain.WebResource 
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83) 
     at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77) 
     at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1995) 
     at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:61) 
     at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1970) 
     at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:518) 
     at org.hibernate.loader.criteria.CriteriaQueryTranslator.findColumns(CriteriaQueryTranslator.java:534) 
     at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:82) 
     at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:417) 
     at org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:123) 
     at org.hibernate.loader.criteria.CriteriaJoinWalker.(CriteriaJoinWalker.java:92) 
     at org.hibernate.loader.criteria.CriteriaLoader.(CriteriaLoader.java:97) 
     at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1663) 
     at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) 
     at org.codehaus.groovy.grails.orm.hibernate.query.AbstractHibernateCriteriaBuilder.invokeMethod(AbstractHibernateCriteriaBuilder.java:1639) 
     at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:907) 
     at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:884) 
     at org.grails.datastore.gorm.GormStaticApi$_withCriteria_closure11.doCall(GormStaticApi.groovy:304) 
     at sun.reflect.GeneratedMethodAccessor254.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
     at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324) 
     at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1207) 
     at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110) 
     at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016) 
     at groovy.lang.Closure.call(Closure.java:423) 
     at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:51) 
     at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:81) 
     at com.sun.proxy.$Proxy29.doInSession(Unknown Source) 
     at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:302) 
     at org.grails.datastore.gorm.AbstractDatastoreApi.execute(AbstractDatastoreApi.groovy:37) 
     at org.grails.datastore.gorm.GormStaticApi.withCriteria(GormStaticApi.groovy:303) 
     at org.mydomain.WebResource.withCriteria(WebResource.groovy) 

ли имеющие свойства домена с именем 'ApplicationContext' не допускается в Grails 2.4.3? Я не мог найти ссылку на этот сценарий, который запрещен в примечаниях к выпуску Grails, руководствах по обновлению или JIRA. Я работал вокруг этого вопроса путем переименования поля и изменения ссылок Горма на новое имя:

class WebResource { 
    String appContext 
    appContext column: 'APPLICATION_CONTEXT' 
    public String getApplicationContext() { 
     return appContext 
    } 

    public void setApplicationContext(String c) { 
     appContext = c 
    } 
} 

ответ

1

Учитывая название столкновения с весной ApplicationContext я подозреваю, что вы нашли лучший ответ уже - имя свойства что-то еще и используйте определение mapping для установки имени столбца базы данных. Я бы порекомендовал вам не добавить пару геттер/сеттер, но просто используйте имя свойства appContext прямо в вашем коде, так как есть более чем вероятно места в ядре или плагинах Grails, которые предполагают (довольно разумно, на мой взгляд), что свойство с именем applicationContext является объектом Spring, а не чем-либо еще.

Не сражайтесь с условностями, если только не нужно.