2013-05-27 13 views
14

Jestem nowy w Odtwarzam 2 frameworkv. 2.1.1 z Javą i szukam najlepszego sposobu na wykonanie poniższych czynności bez powielania kodu.Odtwórz obiekty modelu z zewnętrznego interfejsu API

Aby uprościć, mam zaplecze backoffice Play 2, które korzysta z zewnętrznego interfejsu API. Nie zarządzam tym interfejsem API, ale wywołuję usługi REST w celu wykonywania operacji za pośrednictwem interfejsu API.

Obiekty tego interfejsu API są dokładnie takie same, jak obiekty Odtwórz 2 Obiekty modelu. Nie chcę jednak duplikować obiektów APi, aby dodać sprawdzenia dotyczące odtwarzania i inne adnotacje.

Czy istnieje sposób na dodanie tego typu zachowania przy użyciu plików konfiguracyjnych? Myślę o czymś takim, jak na przykład Hibernate hbm's.

Na przykład:

Obiekt w niezarządzanego API: (Pomijam pobierające i ustawiające dla uproszczenia)

public class Entity{ 
    public String field1; 
    public String field2; 
} 

obiektu, który chcę uniknąć: (Pomijam pobierające i ustawiające dla uproszczenia)

public class Entity1{ 

    @Required 
    @NonEmpty 
    @MinLength(3) 
    public String field1; 

    @Required 
    @NonEmpty 
    public String field2; 
} 

Przykład konfiguracji : (muszę coś takiego)

<class name="Entity1"> 
    <property name="field1" > 
     <required/> 
     <nonEmpty/> 
     <minLength value="3"/> 
    </property> 
    <property name="field2" > 
     <required/> 
     <nonEmpty/> 
    </property> 
</class> 

Korzystanie adnotacje wydaje się lepsze niż przy użyciu plików XML lub dowolny inny plik konfiguracyjny, więc nie koniecznie chcą korzystać z plików konfiguracyjnych, jestem otwarty na wszelkie sugestie, aby rozwiązać ten problem.

Dzięki

+0

Nie jestem pewien, co próbujesz osiągnąć tutaj. Co masz na myśli przez Backoffice Play2? Czy zewnętrzny interfejs API jest interfejsem REST API zwracającym dane json? – mor

+0

Cześć! Backoffice to aplikacja internetowa, która wywołuje usługi REST w celu wykonywania operacji w interfejsie API. –

+0

Czy mógłbyś wyjaśnić, jak generujesz obiekt 'Entity' z wywołania API? Od tego momentu będzie łatwiej zobaczyć, w jaki sposób możesz skorzystać z możliwości sprawdzania poprawności Play2. – mor

Odpowiedz

0

Jednym z problemów jest ebean jako dostawca trwałości - w ebean nie ma sposobu, aby uzewnętrznić konfigurację fasola trwałości, jak to jest możliwe w hibernacji (z wyjątkiem zapytań SQL). Czy możliwe jest przełączenie dostawcy uporczywości? Gra wydaje się pozwalać na to.

Ponieważ napisałeś, że nie możesz zmodyfikować kodu źródłowego encji i nie chcesz kopiować źródła, jedyną inną możliwością, którą widzę, jest poprawienie kodu bajtowego.

Potrzebna jest biblioteka, która umożliwiałaby zewnętrzną adnotację w pliku xml. Ta biblioteka użyje api oprzyrządowania, odczyta plik xml w statystykach jvm i zmodyfikuje kod bajtowy każdej wymienionej klasy, aby dodać adnotacje do klasy i pól w środowisku wykonawczym.

Istnieją dwa problemy z tym podejściem:

  1. nie ma takiej biblioteki (przynajmniej ja nie mogę go znaleźć)
  2. play i EBean wykorzystać własne agenta/classloader w celu umożliwienia gorąco wdrożenie i utrwalanie

Pierwszy problem to łatwa i przyjemna część, patrz na przykład https://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html. Przy pomocy javaassisty można łatwo dodawać adnotacje do klas i pól. Mapowanie z xml do adnotacji jest proste. I byłby to fajny projekt open source.

Drugi problem wygląda o wiele trudniej, ponieważ musisz zainstalować agenta adnotacji, aby był uruchamiany przed rozpoczęciem odtwarzania i rozpoczęciem ebean, aby przeanalizować adnotacje.

0

Nie jest dla mnie jasne, dlaczego nie można dodawać adnotacji do własnej aplikacji, ale jeśli masz takie ograniczenia, po prostu nie rozszerzaj klasy, nie zmieniaj zmiennych, nie dodawaj adnotacji i używaj go jako Model EBean?

0

Gra ma dynamiczne formularze, które pozwalają na walidację z mapą par klucz, wartość. Jeśli sprawdzanie poprawności jest tym, czego potrzebujesz, możesz skopiować dane jednostki do mapy i potwierdzić to.

1

Nie rozumiem, w jaki sposób powielanie modelu API w deskryptorze nieobsługiwanym przez typy kodów, takim jak XML, jest lepsze niż w przypadku używania bezpiecznego języka. Co więcej, nie chciałbym łączyć mojego modelu i aplikacji z modelem API pod moją kontrolą.

Myślę, że znacznie lepiej jest powielić model w Javie/Scali i użyć prostej kopiarki do fasoli, takiej jak spychacz, aby przemieszczać się między tymi dwoma.

0

Prosta odpowiedź: nie ma zawsze powielania kodu również wtedy, gdy linie kodu są takie same.

Robert C. Martin pokazuje to w jednym ze swoich wykładów: jedna odpowiedzialna zasada. Istnieją dwa sposoby na przełamanie tej zasady: Z jednej strony dwie obowiązki w jednym fragmencie kodu, z drugiej jedna odpowiedzialność jest rozpatrywana niezależnie od dwóch fragmentów kodu.

Powielanie kodu to kwestia odpowiedzialności i semantyki, a nie linii kodu, które są takie same (co może być najwyżej wskaźnikiem duplikacji kodu).

W twoim przypadku obowiązki są wyraźnie rozdzielone: ​​Masz zewnętrzny interfejs API i swój kod. Więc nie ma duplikacji kodu.

Powiązane problemy