Podczas używania Grails z klasy domeny hierarchii podobny do następującego:Grails: symulować proxy hibernacji do testowania
abstract class Vehicle { ... }
class Car extends Vehicle { ... }
class Motorcycle extends Vehicle { ... }
i usługi jak:
class VehicleService {
def startRepairing(Car car) { ... }
def startRepairing(Motorcycle motorcycle) { ... }
}
My bardzo często mamy do czynienia błędy następujące w produkcji:
Brak podpisu metody: VehicleService.startRepairing() dotyczy typy argumentów: (Car _ $$ _ javassist_156) wartości: [Id: 42343, Class: Car]. Możliwe rozwiązania: startRepairing (CAR)
Wierzymy, że to się dzieje, ponieważ pobierzemy instancję Vehicle
z kolekcji takich jak static hasMany = [vehicles: Vehicle]
, co powoduje, że serwer proxy do wdrożenia klasy abstrakcyjnej Vehicle
ale nie klasy betonu (Car
, Motorcycle
itp.).
Użyliśmy usunąć typ argumentu ze sposobu w postaci roztworu, ale wolelibyśmy mieć go - kod jest czystsze, przeciążeniem metoda jest możliwe, bardziej przyjazne IDE ...
Jednym z rozwiązań jest myśleliśmy o używać niesławny GrailsHibernateUtil.unwrapIfProxy jeśli typ nie pasuje do żadnej innej metody:
class VehicleService {
def startRepairing(Vehicle vehicle) {
startRepairing(GrailsHibernateUtil.unwrapIfProxy(vehicle))
}
def startRepairing(Car car) {
/* actual business logic here */
}
def startRepairing(Motorcycle motorcycle) {
/* actual business logic here */
}
}
ale wtedy powstaje pytanie, w jaki sposób możemy to sprawdzić? Podczas pracy z kodem w rozwoju bardzo rzadko znajdujemy problem z javasistami, a nawet w produkcji wydaje się, że dzieje się to "losowo" (a dokładniej, z powodu warunków, które wymykają się naszej wiedzy).
Czy można wymusić, aby instancja była proxy pośredniczącym javassist? Jaka byłaby dobra strategia dla tego rodzaju problemów w ogóle?
Używaj dynamicznej strony groovy i zadeklaruj Object zamiast Car w swoim kodzie. W czasie wykonywania metoda zostanie znaleziona na instancji proxy i wszystko będzie dobrze. – MatRt
Zmiana sygnatury mojej metody z powodu ograniczeń testowania nie brzmi dla mnie dobrze: -/ – Deigote