使用Grails的DTO时无法调用Post操作

使用Grails的DTO时无法调用Post操作,grails,dto,Grails,Dto,我希望在使用grails时使用DTOs。我的DTO基本上如下所示: class ProjectDTO { Long id Long version String name } 我将该文件放在src/groovy中,以便grails理解这不是一个域模型。 我还有一个转换器,可以将projectDTO转换为projectobject @Transactional def save(ProjectDTO projectInstance) { if (projectInstance

我希望在使用grails时使用DTOs。我的DTO基本上如下所示:

class ProjectDTO {
   Long id
   Long version
   String name
}
我将该文件放在src/groovy中,以便grails理解这不是一个域模型。 我还有一个转换器,可以将projectDTO转换为projectobject

@Transactional
def save(ProjectDTO projectInstance) {
if (projectInstance == null) {
    render status: NOT_FOUND
    return
}       
ProjectDTOConverter converter = new ProjectDTOConverter()
Project p =  converter.convertFromDTOForSave(projectInstance)
p = projectService.save(p)

List<ProjectDTO> r = converter.convertToDTO(p)
respond r, [status: CREATED]
}
@Transactional
def保存(ProjectdToProjectInstance){
if(projectInstance==null){
渲染状态:未找到
回来
}       
ProjectDTOConverter converter=新的ProjectDTOConverter()
项目p=转换器。convertFromDTOForSave(projectInstance)
p=projectService.save(p)
列表r=转换器。转换到(p)
响应r,[状态:已创建]
}
此策略似乎适用于GET、POST和DELETE操作,但不适用于PUT操作。对于put操作,grails似乎总是认为我的projectInstance变量为null,即使它被正确地传入

我做了一个SQL假脱机,似乎当您将任何对象传入PUT操作时,grails假定您正在处理一个域对象,并发出一条SQL语句来尝试从数据库检索该对象。如果无法检索对象,出于某种原因,projectInstance将被置空


有人知道有没有方法可以告诉Grails,我为PUT操作传递的对象不是域模型,Grails不应该从数据库中检索它?

您在这里谈论的是标准的
更新(ProjectDTO projectInstance)
方法吗?如果给定id,Grails将从db中提取实例,并将给定的属性值绑定到实例。如果出于任何原因,您不需要此自动绑定,您只需声明不带参数的
update()
,并自行绑定传入属性(例如使用
bindData
)。出于好奇,您有什么理由不使用命令对象来实现此目的吗?谢谢您回复我。据我所知,数据绑定用于将http请求参数映射到域对象。但在我的情况下,我希望通过请求主体传递我的项目对象,就像我对post操作所做的那样。我的项目对象是一个复杂的对象,所以我不希望通过http请求参数传入每个字段。它位于src/groovy中。我在启动应用程序时也看到此警告。警告[update]操作接受ProjectDTO类型的参数,该参数未标记为@Validateable。数据绑定仍将应用于此命令对象,但实例将不可验证。问题是,在PUT操作中,grails似乎希望通过我传入的id获取对象。的确,从grails的角度来看,DTO与命令对象是一样的(可能只是缺少了前面提到的
@validatable
注释)。我之所以这么问是因为你自己实现了转换器。但是,如果
converter.convertFromDTOForSave(projectInstance)
包含的逻辑多于复制属性,那么它似乎是有意义的。正如我已经说过的,删除method参数并自己创建一个实例。我不太清楚“通过http请求参数传入每个字段”是什么意思。下面是他们关于使用bindData的文档:“对于许多web应用程序来说,一个非常常见的任务是应用程序接受一组http请求参数并将这些参数绑定到一个对象。”如果我删除方法参数并自己创建实例,我必须使用http请求参数来完成。http请求参数用于填充它们在文档中提到的params对象。我将在这个对象上有大约50个字段,很难将它们作为请求参数传入。