1

ドメイン クラスの更新に問題があります。Grails 3.0.9 と MongoDB を使用しています (Gorm 5.0.0.RC1 用)

私のbuild.gradleでは:

compile "org.grails.plugins:mongodb:5.0.0.RC1"
compile "org.mongodb:mongodb-driver:3.0.2"
compile "org.grails:grails-datastore-gorm-mongodb:5.0.0.RC1"
runtime 'org.springframework.data:spring-data-mongodb:1.8.1.RELEASE'
compile("org.grails:gorm-mongodb-spring-boot:5.0.0.RC1")

テスト:

@Integration
class CompanyControllerIntegrationSpec extends Specification{
def grailsApplication

Company company
RestBuilder rest

def setupData() {
    company = Company.buildWithoutSave().save(flush: true, failOnError: true) 

}

def setup(){
    rest = new RestBuilder()
} 


def "test update a company" (){
    def company2
    given:
        setupData()
        def id = company.id
    when:
        RestResponse response = rest.put("http://localhost:${grailsApplication.config.server.port}/${company.companyKey}/company") {
            json {
                name = "newName"
                description = "new Description"
            }
        }
        company2 = Company.findById(id)
    then:
        response.status == 200
        response.json.name == "newName"
        company2.name == "newName"
        company2.description == "new Description"
}
def cleanup() {
   Company.collection.remove(new BasicDBObject())
}

}}

コントローラー:

class CompanyController extends ExceptionController{

static allowedMethods = ['update':'PUT','show':'GET',
    'updateNew':'PUT','showNew':'GET']

CompanyService companyService

def update(String companyKey){

    def object = request.JSON?request.JSON:params
    Company companyOut = companyService.update(object, companyKey)

    render text:companyOut as JSON, status:HttpStatus.OK
}
}

サービス:

class CompanyService {

def securityService
def grailsApplication

public Company update(object, String companyKey) throws ForbiddenException, InvalidRequestException, NotFoundException{
    Company company = findByKey(companyKey)
    if (object.name!=null)
        company.name = object.name
    if (object.description!=null)
        company.description = object.description
    if (object.enterprise!=null)
        company.enterprise = object.enterprise
    if (object.genKey!=null)
        company.companyKey = UUID.randomUUID().toString()

    if (!company.save(flush:true)){
        println company.errors
        throw new InvalidRequestException("Some parameters are missing or are invalid: "+company.errors.fieldErrors.field)
    }

    return company
}
public Company findByKey(String companyKey) throws NotFoundException, ForbiddenException {
    if (!companyKey){
        throw new ForbiddenException("The company key has not been given")
    }
    Company company = Company.findByCompanyKey(companyKey)
    if (!company){
        throw new NotFoundException("No company exists for the given key")
    }
    return company
}
}

テストの結果は次のとおりです。
- response.status は 200
- response.json.name は「newName」
- company.name は古い名前 (「company 1」)

クリーンアップを行わないと、データベースにはまだ古い値が残っています。Mongo gorm クラス内でも save メソッドに従いましたが、フィールドがダーティとしてマークされていないという問題が 1 つありますが、その理由はわかりません。これに似た他のドメイン クラスでは、更新は問題なく行われ、プロパティはダーティとしてマークされます。

4

0 に答える 0