2013-02-21 3 views
1

Я новичок в Grails, и я попытался сохранить модель с идентификатором типа UUID. Я знаю, что есть ObjectId, но на данный момент я бы продолжал UUID.Проблемы с UUID с Grails, GORM и MongoDB

class Book { 
    UUID id 
    String title 
} 

У меня есть BookController, где я включил строительные леса. Когда я в настоящее время загрузить контроллер и попытаться добавить новую книгу, я получаю следующее сообщение об ошибке с Grails:

 
Error 500: Internal Server Error 
URI /GrailsTest/book/save 
Class org.springframework.core.convert.ConverterNotFoundException 
Message No converter found capable of converting from type java.lang.String to type java.util.UUID 
Around line 24 of grails-app/controllers/ch/teamrg/test/BookController.groovy 
Around line 186 of PageFragmentCachingFilter.java 
183:   if(method == null) { 
184:    log.debug("No cacheable method found for {}:{} {}", 
185:      new Object[] { request.getMethod(), request.getRequestURI(), getContext() }); 
186:    chain.doFilter(request, response); 
187:    return; 
188:   } 
189:   Collection cacheOperations = cacheOperationSource.getCacheOperations(
Around line 63 of AbstractFilter.java 
60:  try { 
61:   // NO_FILTER set for RequestDispatcher forwards to avoid double gzipping 
62:   if (filterNotDisabled(request)) { 
63:    doFilter(request, response, chain); 
64:   } 
65:   else { 
66:    chain.doFilter(req, res); 
Trace 
    Line | Method 
->> 18 | convert   in org.grails.datastore.mapping.model.types.conversion.DefaultConversionService 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 365 | cacheNativeEntry in org.grails.datastore.mapping.engine.NativeEntryEntityPersister 
| 725 | persistEntity . in  '' 
| 125 | persist   in org.grails.datastore.mapping.engine.EntityPersister 
| 479 | persist . . . . in org.grails.datastore.mapping.core.AbstractSession 
| 166 | doSave   in org.grails.datastore.gorm.GormInstanceApi 
| 143 | doCall . . . . . in org.grails.datastore.gorm.GormInstanceApi$_save_closure4 
| 301 | execute   in org.grails.datastore.mapping.core.DatastoreUtils 
| 34 | execute . . . . in org.grails.datastore.gorm.AbstractDatastoreApi 
| 142 | save    in org.grails.datastore.gorm.GormInstanceApi 
| 258 | call . . . . . . in org.grails.datastore.gorm.InstanceMethodInvokingClosure 
| 24 | save    in BookController.groovy 
| 186 | doFilter . . . . in PageFragmentCachingFilter.java 
| 63 | doFilter   in AbstractFilter.java 
| 886 | runTask . . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
| 908 | run    in  '' 
^ 680 | run . . . . . . in java.lang.Thread 

я поставил точку останова на org.grails.datastore.mapping.engine.NativeEntryEntityPersister. Когда приложение попадет туда, я могу разрешить часть getMappingContext(). GetConversionService(), которая возвращает экземпляр org.grails.datastore.mapping.model.types.conversion.DefaultConversionService. Этот экземпляр имеет 10 преобразователей, включая конвертеры для ObjectId и Binary. Я спрашиваю себя, где я могу настроить свой собственный конвертер, чтобы я мог конвертировать между String и UUID?

Поскольку я новичок в Grails, я не знаю, где разместить требуемые файлы Java и в каком файле я должен указать, какую конфигурацию. Было бы здорово, если бы кто-то мог указать мне в правильном направлении.

ответ

0

В документах есть сеанс для custom user types.

Таким образом, вам необходимо создать класс типа, который расширяет AbstractMappingAwareCustomTypeMarshaller и регистрируется как Spring Bean (см. Окончание документа).