Grails、GORM和MongoDB的UUID问题
我是Grails新手,我尝试用UUID类型的id持久化模型。我知道有ObjectId,但现在我想坚持UUIDGrails、GORM和MongoDB的UUID问题,mongodb,grails,gorm,Mongodb,Grails,Gorm,我是Grails新手,我尝试用UUID类型的id持久化模型。我知道有ObjectId,但现在我想坚持UUID class Book { UUID id String title } 我有一个BookController,在那里我启用了脚手架。当我现在加载控制器并尝试添加新书时,我从Grails收到以下错误消息: Error 500: Internal Server Error URI /GrailsTest/book/save Class org.springframework.cor
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
错误500:内部服务器错误
URI/grailtest/book/save
类org.springframework.core.convert.ConverterNotFoundException
未找到能够从java.lang.String类型转换为java.util.UUID类型的消息转换器
grails app/controllers/ch/teamrg/test/BookController.groovy第24行附近
在PageFragmentCachingFilter.java的第186行附近
183:if(方法==null){
184:log.debug(“没有为{}:{}{}找到可缓存的方法”,
185:新对象[]{request.getMethod(),request.getRequestURI(),getContext()});
186:chain.doFilter(请求、响应);
187:返回;
188: }
189:集合cacheOperations=CacheOperationsSource.getCacheOperations(
关于AbstractFilter.java的第63行
60:试试看{
61://为RequestDispatcher转发设置了NO_筛选器,以避免双重gzip
62:if(过滤器未禁用(请求)){
63:doFilter(请求、响应、链);
64: }
65:还有吗{
66:chain.doFilter(请求、回复);
痕迹
直线法
->>18 |在org.grails.datastore.mapping.model.types.conversion.DefaultConversionService中转换
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|365 | org.grails.datastore.mapping.engine.nativeEntryEntityTyperMaster中的cacheNativeEntry
|725 |在“”中
|125 |在org.grails.datastore.mapping.engine.EntityPersister中持久化
|479 |在org.grails.datastore.mapping.core.AbstractSession中持久化
|166 |存储在org.grails.datastore.gorm.GormInstanceApi中
|143 | doCall…..在org.grails.datastore.gorm.GormInstanceApi$_save_closure4中
|301 |在org.grails.datastore.mapping.core.DatastoreUtils中执行
|34 |在org.grails.datastore.gorm.AbstractDatastoreApi中执行
|142 |保存在org.grails.datastore.gorm.GormInstanceApi中
|258 |在org.grails.datastore.gorm.InstanceMethodInvokingClosure中调用
|24 |保存在BookController.groovy中
|186 | doFilter…在PageFragmentCachingFilter.java中
|63 | AbstractFilter.java中的doFilter
|886 | runTask….在java.util.concurrent.ThreadPoolExecutor$Worker中
|908 |磨合“
^680 |在java.lang.Thread中运行
我在org.grails.datastore.mapping.engine.nativeEntryEntityypersister上设置了一个断点。当应用程序到达该断点时,我可以解析getMappingContext().getConversionService()返回org.grails.datastore.mapping.model.types.conversion.DefaultConversionService实例的部分。此实例配置了10个转换器,包括ObjectId和Binary的转换器。我现在问自己,我可以在哪里配置自己的转换器,以便在字符串和UUID之间进行转换
由于我是Grails新手,我不知道将所需的Java文件放在哪里,也不知道必须将什么样的配置放在哪个文件中。如果有人能给我指出正确的方向,那就太好了。文档中有一个会话 因此,您需要创建扩展
AbstractMappingAwareCustomTypeMarshaller
的类型类,并注册为Springbean
(请参见文档的最后部分)