<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Michał Borek - tech blog &#187; spring framework</title>
	<atom:link href="http://www.greenpath.pl/tag/spring-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.greenpath.pl</link>
	<description>Techblog</description>
	<lastBuildDate>Tue, 11 May 2010 10:15:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Walidacja identyczności haseł &#8211; Hibernate Validator, Spring Framework</title>
		<link>http://www.greenpath.pl/2009/12/walidacja-identycznosci-hasel-hibernate-validator-spring-framework/</link>
		<comments>http://www.greenpath.pl/2009/12/walidacja-identycznosci-hasel-hibernate-validator-spring-framework/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 20:47:26 +0000</pubDate>
		<dc:creator>Michał Borek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://www.greenpath.pl/?p=140</guid>
		<description><![CDATA[Natknąłem się na problem walidacji identyczności haseł w formularzu rejestracji użytkownika.
Korzystam ze Spring Frameworka, a do walidacji wykorzystuję bibliotekę Hibernate Validator w wersji 4.
Pierwszym problemem okazał się brak pola confirmPassword  w klasie User. Poszperałem na forach i znalazłem w rozwiązania tego problemu:

Stworzyć dodatkowe pole w klasie User  - confirmPassword
Stworzyć dodatkową klasę, przypuśćmy CreateUserForm, mniej więcej [...]]]></description>
			<content:encoded><![CDATA[<p>Natknąłem się na problem walidacji identyczności haseł w formularzu rejestracji użytkownika.<br />
Korzystam ze Spring Frameworka, a do walidacji wykorzystuję bibliotekę Hibernate Validator w wersji 4.</p>
<p>Pierwszym problemem okazał się brak pola confirmPassword  w klasie User. Poszperałem na forach i znalazłem w rozwiązania tego problemu:</p>
<ol>
<li>Stworzyć dodatkowe pole w klasie User  - confirmPassword</li>
<li>Stworzyć dodatkową klasę, przypuśćmy CreateUserForm, mniej więcej tak:</li>
</ol>
<pre>
class CreateUserForm {
String confirmPassword;
User user;
(... )
}</pre>
<p>Rozwiązanie to wydaje mi się &#8220;ładniejsze&#8221; niż pierwsze, gdyż nie tworzymy w klasie, wykorzystywanej przy każdym requescie pola, które w ogóle nam jest niepotrzebne.</p>
<p>Kolejnym problemem okazała się walidacja. Chcieliśmy w 100% korzystać z funkcjonalności, jakie dają nam adnotacje z Hibernate Validatora. Brakuje jednak tam adnotacji umożliwiającej porównywanie ze sobą 2 pól.</p>
<p>Tutaj też skorzystałem z forów. Jedna osoba z teamu hibernate poleciła mi wykorzystanie constraintów (przepraszam za nieprzetłumaczenie <img src='http://www.greenpath.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) przypisanych do klas i zmianę domyślnego błędu zwracanego przez ten walidator.</p>
<p>Poniżej przedstawię rozwiązanie od jakiego doszedłem:</p>
<p>Poniżej znajduje się definicja interfejsu odpowiedzialnego za adnotację @SamePassword</p>
<pre>@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = SamePasswordValidator.class)
public @interface SamePassword {

String message() default "{pl.aetas.gamestore.validator.constraint.SamePassword}";

Class&lt;?&gt;[] groups() default {};

Class&lt;? extends Payload&gt;[] payload() default {};
}</pre>
<p>Sama klasa walidatora wygląda tak:</p>
<pre>public class SamePasswordValidator implements ConstraintValidator&lt;SamePassword, Object&gt; {

SamePassword constraintAnnotation;

public boolean isValid(Object value, ConstraintValidatorContext context) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(constraintAnnotation.message()).addNode("confirmPassword").addConstraintViolation();
CreateUserForm u = (CreateUserForm) value;
if (u.getConfirmPassword().equals(u.getUser().getPassword())) {
return true;
}
return false;
}

public void initialize(SamePassword constraintAnnotation) {
this.constraintAnnotation = constraintAnnotation;
}
}</pre>
<p>Aby skorzystać z w/w rozwiązania wystarczy w klasie CreateUserForm dodać adnotację @SamePassword (na poziomie klasy) i .. tyle <img src='http://www.greenpath.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Mam nadzieję, że komuś się to przyda. W naszym projekcie adnotacje znacznie zwiększyły czytelność kodu, a jest to bardzo istotne przy pracy grupowej.</p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.greenpath.pl/2009/12/walidacja-identycznosci-hasel-hibernate-validator-spring-framework/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.greenpath.pl/2009/12/walidacja-identycznosci-hasel-hibernate-validator-spring-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring 3.0.0 RC3 ujrzał światło dzienne</title>
		<link>http://www.greenpath.pl/2009/12/spring-3-0-0-rc3-ujrzal-swiatlo-dzienne/</link>
		<comments>http://www.greenpath.pl/2009/12/spring-3-0-0-rc3-ujrzal-swiatlo-dzienne/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 20:31:07 +0000</pubDate>
		<dc:creator>Michał Borek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://www.greenpath.pl/?p=137</guid>
		<description><![CDATA[Wczoraj tj 1 grudnia 2009 roku światło dzienne ujrzała trzecia wersja RC Spring Frameworkwa.
Z tego co udało mi się zauważyć, poprawiona została implementacja namespace&#8217;a mvc, a konkretnie mvc:annotation-driven, która sprawiała mi problemy w wersji RC1. Poza tym poprawiono sporo innych błędów. Pełny changelog znajduje się na stronie: http://www.springsource.org/node/2198 .
Mam nadzieję, że jest to już ostatnia [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj tj 1 grudnia 2009 roku światło dzienne ujrzała trzecia wersja RC Spring Frameworkwa.</p>
<p>Z tego co udało mi się zauważyć, poprawiona została implementacja namespace&#8217;a mvc, a konkretnie mvc:annotation-driven, która sprawiała mi problemy w wersji RC1. Poza tym poprawiono sporo innych błędów. Pełny changelog znajduje się na stronie: <a href="http://www.springsource.org/node/2198">http://www.springsource.org/node/2198 </a>.</p>
<p>Mam nadzieję, że jest to już ostatnia wersja kandydująca i następną wersją będzie wersja GA <img src='http://www.greenpath.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.greenpath.pl/2009/12/spring-3-0-0-rc3-ujrzal-swiatlo-dzienne/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.greenpath.pl/2009/12/spring-3-0-0-rc3-ujrzal-swiatlo-dzienne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testowanie ze Springiem &#8211; nowa porcja wiedzy :)</title>
		<link>http://www.greenpath.pl/2009/11/testowanie-ze-springiem-nowa-porcja-wiedzy/</link>
		<comments>http://www.greenpath.pl/2009/11/testowanie-ze-springiem-nowa-porcja-wiedzy/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 21:17:16 +0000</pubDate>
		<dc:creator>Michał Borek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://www.greenpath.pl/?p=131</guid>
		<description><![CDATA[Chciałbym napisać nieco więcej na temat testowania w Springu i przytoczę tutaj kilka luźno związanych, ale wartych zapamiętania reguł.
Przede wszystkim, kiedy tworzymy testy integracyjne i tworzymy kontekst aplikacji musimy wiedzieć, że kontekst ten tworzony jest raz na cały cykl testów. Jest to ważne, gdyż czasem stan naszych beanów może się zmienić podczas testów i może [...]]]></description>
			<content:encoded><![CDATA[<p>Chciałbym napisać nieco więcej na temat testowania w Springu i przytoczę tutaj kilka luźno związanych, ale wartych zapamiętania reguł.</p>
<p>Przede wszystkim, kiedy tworzymy testy integracyjne i tworzymy kontekst aplikacji musimy wiedzieć, że kontekst ten tworzony jest raz na cały cykl testów. Jest to ważne, gdyż czasem stan naszych beanów może się zmienić podczas testów i może to powodować nieprawidłowe wykonywanie kolejnych testów. Aby zapobiec temu problemowi wykorzystujemy dodatkową adnotację:</p>
<p><strong>@DirtiesContext</strong> &#8211; adnotacja do metody, która określa, że konspekt aplikacji mógł zostać zmieniony przez test i musi zostać konspekt musi zostać stworzony od nowa.</p>
<p>Ogólnie sam fakt, że kontekst tworzony jest raz jest bardzo korzystny dla nas, gdyż skraca to znacznie czas wykonywania testów.</p>
<p>Poniżej opiszę jeszcze 2 ciekawe adnotacje, które znacznie rozszerzają możliwości testów.</p>
<p>Pierwszą z nich jest:</p>
<p><strong>@Timed(millis=1000)</strong> &#8211; która, jak można się domyślić, określa w jakim maksymalnym czasie, test ma zostać wykonany. Jeżeli test wykonuje się dłużej, nie jest on spełniony.</p>
<p><strong>@Repeat(10)</strong> &#8211; test wykonywany jest wielokrotnie (w tym wypadku 10 razy) i tylko w przypadku, gdy wszystkie 10 testów przejdzie, test zostanie spełniony.</p>
<p>Nie jest to cała lista adnotacji, jednakże  są to najciekawsze (wraz z tymi z poprzedniego wpisu) wg mojego uznania <img src='http://www.greenpath.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Po więcej odsyłam do referencji Springa <img src='http://www.greenpath.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.greenpath.pl/2009/11/testowanie-ze-springiem-nowa-porcja-wiedzy/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.greenpath.pl/2009/11/testowanie-ze-springiem-nowa-porcja-wiedzy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java &#8211; Spring 2.5.6 testowanie DAO z użyciem adnotacji</title>
		<link>http://www.greenpath.pl/2009/11/java-spring-2-5-6-testowanie-dao-z-uzyciem-adnotacji/</link>
		<comments>http://www.greenpath.pl/2009/11/java-spring-2-5-6-testowanie-dao-z-uzyciem-adnotacji/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 23:17:46 +0000</pubDate>
		<dc:creator>Michał Borek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[dao]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[spring framework]]></category>

		<guid isPermaLink="false">http://www.greenpath.pl/?p=126</guid>
		<description><![CDATA[Ostatnimi czasy siedzę trochę w Spring Framework, frameworku dla Javy. Doszedłem do etapu testów i stwierdziłem, że godnym opisania będzie sposób testowania metod opartych o transakcje, gdyż ciekawym jest fakt iż wszystko co odbywa się w danych testach (dodawanie danych, edycja itd.) jest następnie cofane do wersji pierwotnej (wywoływany jest rollback na transakcji) i dzieje [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnimi czasy siedzę trochę w Spring Framework, frameworku dla Javy. Doszedłem do etapu testów i stwierdziłem, że godnym opisania będzie sposób testowania metod opartych o transakcje, gdyż ciekawym jest fakt iż wszystko co odbywa się w danych testach (dodawanie danych, edycja itd.) jest następnie cofane do wersji pierwotnej (wywoływany jest rollback na transakcji) i dzieje się to automatycznie.</p>
<p>Poniżej znajduje się przykładowa klasa wraz z metodami testującymi. Wszystko oparte jest na adnotacjach, więc nie ma problemu:</p>
<pre>@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:test-config.xml"
public class UserAccountDaoImplTest {

    @Resource
    UserAccountDaoImpl userAccountDaoImpl;

    @Test
    @Transactional
    public void testSaveUser() {
        System.out.println("saveUser");
        UserAccount transientInstance = new UserAccount();
        transientInstance.setEmail("email@mail.con");
        transientInstance.setEnabled(true);
        userAccountDaoImpl.saveUser(transientInstance);
        UserAccount userFromDb = userAccountDaoImpl.getByEmail("email@mail.con);
        assertNotNull("User should be not null", userFromDb);

assertTrue("User should be enabled", userFromDb.isEnabled());
        assertTrue("User should be non locked", userFromDb.isAccountNonLocked());
    }

    @Test(expected = ConstraintViolationException.class)
    @Transactional
    public void testSaveUserDuplicateEmail() {
        System.out.println("saveUserDuplicateEmail");
        UserAccount transientInstance = new UserAccount();
        transientInstance.setEmail("michal@somedomain.pl");
        userAccountDaoImpl.saveUser(transientInstance);
    }

    @Test
    @NotTransactional
    public void testGetUserById() {
        System.out.println("getUserById");
        long id = 1L;
        UserAccount result = userAccountDaoImpl.getUserById(id);
        assertNotNull("User with id " + id + " should be found", result);
        assertEquals(new Long(id), result.getId())        id = 667L;
        result = userAccountDaoImpl.getUserById(id);
        assertNull("User with id " + id + " should not be found", result);

    @Test(expected = UsernameNotFoundException.class)
    @NotTransactional
    public void testGetByEmailNoUser() {
        System.out.println("getByEmailNoUser");
        String email = "someone@gnail.con";
        userAccountDaoImpl.getByEmail(email);
    }
}</pre>
<p>Początkowo inicjujemy kontekst springa (definiujemy która klasa się tym zajmie i dodajemy plik konfiguracyjny).</p>
<p>@RunWith(SpringJUnit4ClassRunner.class)<br />
@ContextConfiguration(locations = &#8220;classpath:test-config.xml&#8221;)</p>
<p>Następnie musimy wstrzyknąć do testu instancję którą testujemy, wykorzystujemy do tego adnotację @Resource:</p>
<p>@Resource<br />
UserAccountDaoImpl userAccountDaoImpl;</p>
<p>Nie będę tutaj opisywał adnotacji czystego JUnita, zwrócę jedynie uwagę na adnotacje potrzebne przy testowaniu danych opartych o DB. Tak więc mamy:</p>
<p>@Transactional &#8211; określa nam, że dana metoda korzysta z transakcji i ma być wykonany rollback<br />
@NotTransactional &#8211; odwrotnie do tego wyżej <img src='http://www.greenpath.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Dodatkowo, co nie zostało pokazane na powyższym przykładzie, możemy skorzystać z adnotacji @Rollback(false) jeżeli nie chcemy, aby wykonywany był rollback po wykonaniu testu.</p>
<p>Mam nadzieję, że powyższy (działający u mnie) przykład komuś się przyda. Ja chwilę spędziłem, zanim doprowadziłem go do porządku, choć okazało się to niezwykle proste (wynik końcowy) <img src='http://www.greenpath.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p class="facebook"><a href="http://www.facebook.com/share.php?u=http://www.greenpath.pl/2009/11/java-spring-2-5-6-testowanie-dao-z-uzyciem-adnotacji/" target="_blank" title="Share on Facebook">Share on Facebook</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.greenpath.pl/2009/11/java-spring-2-5-6-testowanie-dao-z-uzyciem-adnotacji/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
