2013-09-24 17 views
6

yeniden derlendikten sonra çalışır Benim son sınıfları 2.3.0 proje içinde benim controller daha fazla DRY tutmak için bir yardımcı sınıf karıştırmak için @Mixin ek açıklama kullanıyorum. Bir denetleyici recompile zorlamak için kontrolörün içinde bazı değişiklikler yapılmış iseDenetleyici @Mixin sadece çalışan uygulama

mixin sadece çalışıyor. İlk derleme (grails run-app) yardımcı karışık değil sonra - Bir MissingMethodException yardımcı sınıfından bir yöntemi erişmeye çalışıyor olsun. İşte

benim src/groovy witin yardımcısıdır: kullandığı

class ProjectHelper { 
    def withProject(id, Closure c) { 
     def project = Project.get(id) 
     if (project) { 
      c.call project 
     } else { 
      flash.message = 'Project not found!' 
      render view: 'myView' 
      return 
     } 
    } 
} 

Ve (biri) controllerProjectHelper: Ben, I grails clean kullanarak ve uygulamayı başlatma projeyi cleane

@Mixin(ProjectHelper) 
class ProjectController { 
    def index() { 
     withProject params.projectId, {project -> 
      // do something with the project 
     } 
    } 
} 

project/index eriştikten sonra aşağıdaki hatayı alıyorum:

MissingMethodException occurred when processing request: 
    [GET] /<myApp>/project/ 
    No signature of method: <myPackage>.withProject() is applicable for argument types: 
    (java.lang.String, <myPackage>.ProjectController$_index_closure1_closure10) values: 
    [1, <myPackage>[email protected]] 

ReportController'daki bazı değişikliklerden sonra (ör. tek bir alan ekleme) grails 2 kaynak dosyasını derler ve withProject yöntemi kullanılabilir. project/index erişim beklendiği gibi çalışır.

yanlış burada ne oluyor? Bu bir hata mı yoksa bir şeyi mi özlüyorum?

Güncelleme

Bu tamamen grails.util.Mixin kullanarak bana nedeniyle (benim durumumda: flash) sınıf özelliklerinde karışık erişimi eksik başka istisna (MissingPropertyException) verir, cevapsız çıkıyor (JIRA this issue bakınız) groovy.lang.Mixin (yeniden derleme sonrasında) ile çalışıyor.

elle/yeniden derlemek zamanında groovy.lang.Mixin mixin/enjekte yoksa giderilen sorun kadar else kısmı için işleyen diğer bir hatayı bulmak zorunda yapmanın bir yolu var mı?

Herhangi bir öneriniz var mı? katmalar kullanarak benzer bir kod yeniden desen izlerken

+0

@Mixin? groovy.lang.Mixin' veya grails.util.Mixin'? Bir groovy mixin ise diğerini kullanmaya çalışın. – dmahapatro

+0

İkisini de denedim. Ne biri ne de diğeri çalıştı. – aiolos

+0

@dmahapatro Tekrar kontrol ettim! Dün biraz geç oldu - grails.util'i özledim.Mixin başka bir istisna verir. Sorumu güncelleyeceğim ... – aiolos

cevap

2

Düzenli aynı MissingMethodException içine çalışan olmuştu.

Benim durumumda, groovy.lang.Mixin'un grails.util.Mixin'a değiştirilmesi (veya daha doğrusu, denetleyiciye grails.util.Mixin için bir içe aktarma eklenmesi), sorunu tamamen giderdi. Kontrolör değişkenlerine erişim olmamasından gelince

, sen çözülecek GRAILS-9905 bekliyor sıkışmış olabilir. Yine de, hata tartışmasında listelenen bazı önerilen çalışmaların olduğunu belirtmeliyim. Sonunda benim için çalıştı

+1

Neden olduğu hakkında bir fikir yok ama bu işe yaramıyor. İthalat ile hem de '@ Mixin' notunu denedim:/ – Opal

1

geçici çözüm elle Controller kurucusundaki Mixin enjekte etmek oldu:

import com.example.MyMixin 

class SomethingController { 
    def SomethingController() { 
    SomethingController.metaClass.mixin(MyMixin) 
    } 
} 
+0

Ne yazık ki bu da vd 2.3.7 ile çalışmıyor ya da belki bir şey eksik. Gerçekten sinir bozucu. – Opal

+0

@Opal 2.2.4 kullanarak sıkışmış durumdayım. Emin değilim, ama belki de "metaclass" olmadan "SomethingController.mixin MyMixin" 'i doğrudan yapabilirsiniz. Temel olarak bir [çalışma zamanı karışımı] (http://groovy.codehaus.org/Runtime+mixins) istiyorsunuz. – grammar31

+0

@ grammar31 Benim için çalıştım, Grails 2.3.11 kullanıyorum. Bu cevap için teşekkür ederim. –