Czy zamiast tego należy użyć wyliczenia?
Nie możesz. Zmienne adnotacji muszą być stałymi w czasie kompilacji. Są to zarówno emulatory, jak i literały łańcuchowe, ale nie można utworzyć wyliczenia, które jest ciągiem, a @RequestMapping
potrzebuje ciągu (a jeśli twój enum ma metodę zwracającą ciąg lub ciąg, to nie jest to stała czasu kompilacji). Ponieważ istnieje wiele rund przetwarzania komentarzy, działa, gdy stała jest w innej klasie.
Powiedziałem: tak, powiedziałbym, że używanie dedykowanej klasy stałych (być może kilku dla różnych typów stałych) jest dobrą praktyką, której używam, kiedy tylko mogę (i działa z adnotacjami, o ile stała) nie jest zdefiniowany wewnątrz tej samej jednostki kompilacji, która ma adnotację, a b) jest inicjowana w deklaracji (w przeciwieństwie do statycznego bloku inicjalizatora)).
Oto przykład:
Controller
@Controller @RequestMapping(value = Mappings.CUSTOMER_PAGE)
public class CustomerPageController{
// methods here
}
Stałe klasa
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE = "path/to/customer/page"
// more constants
}
A oto niektóre wersje, które nie będą działać:
a)
@Controller @RequestMapping(value = CUSTOMER_PAGE)
public class CustomerPageController{
private static final String CUSTOMER_PAGE = "path/to/customer/page";
}
Nie zostanie skompilowany, ponieważ adnotacja odwołuje się do stałej wewnątrz klasy, którą adnotuje. To nie może działać, ponieważ podczas kompilacji adnotacje są przetwarzane w oddzielnej rundzie przed resztą kodu, podczas gdy klasa wymaga adnotacji, aby była już przetwarzana do kompilacji (tj. Istnieje zależność między adnotacją a stałą)
b)
public static final class Mappings{
private Mappings(){}
public static final String CUSTOMER_PAGE;
static{
CUSTOMER_PAGE = "path/to/customer/page"
}
// more constants
}
Chociaż jest to statyczne pole końcowy, to nie jest stała w czasie kompilacji, a więc nie może być stosowany jako parametr adnotacji
Co masz na myśli przez „break sucho”? Czy to nie działa? czy możesz napisać do nas swoją klasę Constants? – jontro
@jontro przez łamanie DRY Mam na myśli: wartość String może być używana w innych obszarach kodu, więc wartość powinna być przypisana do stałej lub wyliczenia. Nie mam klasy stałych, to jest moja propozycja –
@ user470184, jeśli jest to tylko dla mapowań żądań, użycie intellij usuwa potrzebę tego, ponieważ indeksuje odwzorowania żądań i czyni je dostępnymi jako intelli-text w odpowiednich miejscach. – NimChimpsky