W programach, z których korzysta wielu różnych użytkowników, moduł ustawień potrafi być bardziej skomplikowany niż sama aplikacja. Większość opcji przyjmuje postać wartości logicznych. W naszym zespole powstał nawet termin Single Checkbox Requirement (albo Single Checkbox Apocalypse), oznaczający funkcję programu, która może być włączona ...
Więcej…
Przygotowałem ostatnio plik pom.xml dla projektu korzystającego z AspectJ. Zanim przejdę do omawiania rzeczywistych problemów, przedstawię pokrótce budowę prostego aspektu. Żeby uzyskać jak najwięcej szczegółów, zamiast testów, użyję raczej niezbyt eleganckiego rozwiązania opartego o System.out.
Przygotowania
Na początek utworzę klasę, której dotyczyć będą punkty ...
Więcej…
W związku z sugestiami czytelników, postanowiłem utworzyć i opublikować kilka przydatnych walidatorów Hibernate. Na początek przygotowałem adnotacje dla czterech numerów identyfikacyjnych: NIP, PESEL, REGON oraz seria i numer dowodu osobistego (@IdentityCard).
Najlepiej będzie, jeżeli wyjaśnię działanie walidatorów na przykładach:
import javax.persistence.*;
import pl.info.czerwinski.validators.IdentityCard;
import pl.info.czerwinski.validators.NIP;
import pl.info.czerwinski.validators.PESEL;
import static pl.info.czerwinski.validators.NIP.PersonType.*;
@Entity
@Table(name="persons")
public ...
Więcej…
Od dłuższego czasu miałem problem ze stabilnością aplikacji Seam. Mimo przeszukania dziesiątek stron internetowych, nie udało mi się znaleźć satysfakcjonującego rozwiązania.
Błąd polegał na tym, że wykonanie jakiejkolwiek operacji po ponad 10 minutach bezczynności kończyło się błędem, którego przyczyna prezentowała się następująco:
[…]
Caused ...
Więcej…
Opisane ostatnio testy jednostkowe pozwalają przetestować funkcjonalność pojedynczej klasy. Jednak nie da się w ten sposób przetestować działania komponentów w kontekście.
Encja
Jako przykładu, użyję ustawień aplikacji zapisywanych w bazie danych. Poniżej przedstawiam odpowiednią encję:
@Entity
@Table(name="settings")
@org.hibernate.annotations.Table(appliesTo="settings", indexes={
@Index(name="idx_setting_key", columnNames={"key"})
})
@NamedQueries({
@NamedQuery(
...
Więcej…