Až Vám zčerná obrazovka, přejděte na Linux!

Proč používat Linux
Zobrazují se příspěvky se štítkemIDEA. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemIDEA. Zobrazit všechny příspěvky

pondělí 31. ledna 2011

První potkání s Grails

Tak jsem se po dlouhém odkládání konečně dostal k tomu vyzkoušet si Grails. Na tento framework jsem četl poměrně hodně chvalozpěvů, jak moc je to jednoduché v něm něco udělat, a tak jsem si říkal, že by to snad ani nemuselo být nijak složité.
Stáhl jsem si Grailsy a protože vím, že IntelliJ IDEA má pro Grailsy podporu, zkusil jsem bez jakékoli přípravy to zkusit rozjet.
To, že IDEA je naprosto fantastická, jsem věděl už dávno. Ale to, co jsem právě prožil, to je prostě fantazie.
  1. V prvé řadě vytvoříte Grailsový projekt. Tady není co zkazit, jenom odklikáte from scratch, název a cestu (tak jak jste zvyklí), jenom místo Java projektu zvolíte Grails.
  2. Otevře se Vám místo klasického stromečku Project stromeček GrailsView, které obsahuje logicky uspořádané objekty. V tuto chvíli jsem naprosto nevěděl, co dělat, i sáhl jsem po Gůglu a vygůglil tutoriál Getting Started with Grails od Scotta Davise a Jasona Rudolpha. Je zdarma ke stažení na infoq.com, ale vyžaduje registraci. Tam jsem se dočetl o tom, co je doménová třída, controller a view (skončil jsem na straně 27 u "Hello World")
  3. Přes pravé tlačítko na Domain classes jsem si vytvořil první doménovou třídu Race a nakopíroval do ní seznam atributů z tutoriálu.
  4. Klikl jsem na RaceController - Generate controller, čímž se vygeneroval zajímavě vypadající CRUD Controller.
  5. Klikl jsem na Race Views - Generate views, čímž se vygenerovaly čtyři soubory GSP.
  6. Ze srandy jsem klikl na Run. Otevřel se prohlížeč a v něm uvítací stránka Grailsů a v ní odkaz na RaceController.
  7. Klikl jsem na něj a BINGO! Otevřela se mi velice hezky vypadající jednoduchá, ale plnohodnotná webová aplikace - evidence mých objektů Race!  
V tuto chvíli mi spadla čelist..

Všechno je to pěkně popsáno i s ukázkami zde 
Příště popíšu další zkušenosti s touto na první pohled geniální dvojicí - Grails a IDEA.

středa 30. dubna 2008

Jak na JBossí WebServisy v IDEA

Po několika dnech Googlování a pokusů a omylů se mi konečně podařilo rozchodit první WebServisí komunikaci klient-servisa na zákeřné kombinaci: Windows XP, Sun J2SE 1.6.0_5, JBoss 4.2.2GA, IntelliJ IDEA 7.0.3

Co je třeba udělat:

  1. nainstalovat ony zmíněné produkty :-)
  2. nepoužívat implicitní JAVA_HOME/jre/lib/endorsed adresář, protože se buď nepodaří zkompilovat vygenerované stuby nebo začne řvát JBoss
  3. stáhnout si a nainstalovat jbossws patch:

    1. rozbalit (ideálně hned vedle jboss-4.2.2GA, ať to máte pohromadě)
    2. přejmenovat JBOSSWS_HOME/ant.properties.template na JBOSSWS_HOME/ant.properties
    3. v JBOSSWS_HOME/ant.properties nastavit propertu jboss422.home na JBOSS_HOME (např ../jboss-4.2.2GA)
    4. v JBOSSWS_HOME/build/build-deploy.xml odstranit závislost targetu deploy-jboss422 na undeploy-jboss422 (jinak na Vás zařve, že nemůže smazat soubory v JBOSS_HOME)
    5. pokud není ant v cestě, tak je třeba nastavit
      set "ANT_HOME=JBOSSWS_HOME\tools\ant"
      set "PATH=%ANT_HOME%\bin;%PATH%"

    6. v JBOSSWS_HOME spustit ant deploy-jboss422 - tím se do JBOSS_HOME/lib/endorsed nahrají patřičné jary JAXBčka


  4. napsat si servisu (Web a WebService (JAXB2.1, nikoli Axis))
  5. nadeployit servisu do JBossu
  6. založit projekt pro klienta (WebService client, JAXB2.1, nikoli Axis)
  7. vygenerovat stuby z WSDLka WebServisy
  8. upravit example.HelloWorldClient tak, aby zavolal onu servisu
  9. vytvořit Run Configuration pro klienta (typ Application)
  10. do VM Parameters dát "-Djava.endorsed.dirs=C:\Documents and Settings\tapik\.IntelliJIdea70 \system\webservices\jaxws-ri-2.1\"
  11. spustit a doufat, že funguje

Pokud funguje, je vymalováno.

pátek 25. dubna 2008

IDEA WebService plugin a JDK 1.6

Po šesti letech zkušeností s WASPem (alias Systinet Server for Java) jsem se vrhl do implementace WebServisy, kterou lze nadeployit do JBossu bez nutnosti jakékoli další knihovny. Tak jsem zvolil JavaWS.
Ninstaloval jsem si IDEA WebService Plugin, juknu se letmo na tutorial, zkusim si spustit example webservisu a bac ho:
The exception com.sun.xml.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class example.jaxws.SayHelloWorldFrom is not found. Have you run APT to generate them?
Tak to jsem teda čuměl jak puk. Řeknu si No nic, ask Google. Googlil jsem hodinu, prošel jsem si dokumentaci k JavaWS, JBoss WS, Idea Webservice Plugin. Jediné, co jsem našel, že všem fungovalo, bylo nastavit java.endorsed.dirs na adresář s javaws dodávaný k IntelliJ IDEA. Furt nic. Zkoušel jsem už různé obskurní řešení typu @WebServiceProvider, ale furt nic. Nakonec jsem našel toto naprosto triviální řešení.
By default generuje JavaWS ve formátu WRAPPED, ale já po něm požadoval chování BARE. Stačí tedy nastavit:
@SOAPBinding(parameterStyle=ParameterStyle.BARE) a je po ptákách.

pátek 11. dubna 2008

IDEA a setter/getter generátor

IntelliJ IDEA umí generovat ohromné množství jednotlivých kusů kódu. Například toString() plugin generuje opravdu velice přehledně a inteligentně to, o co by se člověk musel starat. Navíc si můžete napsat několik vlastních šablon a ty potom podle potřeby generátoru vyměňovat.
Opačný extrém ale platí pro gettery a settery. IDEA je umí vygenerovat pro specifikované atributy, ale neumožňuje použít žádnou šablonu ani nakonfigurovat žádnou inteligenci.
Tak jsme hledal, jak toto opravit. A vygoogloval jsem feature request, který přesně o tomto mluví. takže doufám, že se toho brzo dočkáme. Ideálně v podobě pluginu či opravy stávajícího kódu.

středa 9. dubna 2008

Hibernate a Primary Foreign Key

Tak jsem si dneska pořádně naběhl. Chtěl jsem si dvě tabulky provázat přes sdílený klíč, který byl v první Primary Key (tam záznam jako první vzniká) a po zpracování dat uložit do jiné tabulky řádek, jehož ID odpovídá tomu prvnímu, tedy bude hrít roli Primary a Foreign Key zároveň. Principiálně nic složitého.
Nechal jsem si v Idei vygenerovat příslušné anotace:

public class DataBindingEntity {
private long recordId;

@Id
@Column(name = "RECORD_ID", nullable = false)
public long getRecordId() {
return recordId;
}

public void setRecordId(long recordId) {
this.recordId = recordId;
}


private HibertestEntity hibertestByRecordId;

@OneToOne
@JoinColumn(name = "RECORD_ID", referencedColumnName = "ID", nullable = false)
public HibertestEntity getHibertestByRecordId() {
return hibertestByRecordId;
}

public void setHibertestByRecordId(HibertestEntity hibertestByRecordId) {
this.hibertestByRecordId = hibertestByRecordId;
}
...
}

public class HibertestEntity {
private long id;

@Id
@GeneratedValue(generator="triggerAssigned")
@GenericGenerator(name = "triggerAssigned",
strategy = "jpl.hibernate.util.TriggerAssignedIdentityGenerator")
@Column(name = "ID", nullable = false, length = 22)
public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}
private DataBindingEntity dataBindingById;

@OneToOne(mappedBy = "hibertestByRecordId")
public DataBindingEntity getDataBindingById() {
return dataBindingById;
}

public void setDataBindingById(DataBindingEntity dataBindingById) {
this.dataBindingById = dataBindingById;
}
...
}


Jenže jsem si parádně naběhl. Během inicializace sezení jsem chytil NPE:

13:04:59,125 ERROR [[acceptor]] Allocate exception for servlet acceptor
java.lang.NullPointerException
at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1286)


Zakomentování OneToOne propert na obou stranách problém vyřešilo. No, vyřešilo ... :-(

takže si to musím řešit ručně. Nedá se nic dělat.

pondělí 7. dubna 2008

IDEA 7, Hibernate a DB generovaná ID

Musím uznat, že ač je práce s Javím perzistorem Hibernate v IntelliJ IDEA celkem přímočará, dostanete se do stejných potíží, jaké u Hibernate mají i ostatní uživatelé. IDEA je přeci jenom vývojový nástroj, ikdyž geniální. Nic míň, ale také nic víc.
Potřeboval jsem qůli klastrovatelnosti nechat databázi generovat IDčka záznamů. V Oracle je to jednoduché, jde to naklikat v Oracle XE konzoli. ve výsledku asi nejkratší možný SQL záznam vypadá:

CREATE TABLE "HIBERTEST"
( "ID" NUMBER,
"DATA" BLOB,
CONSTRAINT "HIBERTEST_PK" PRIMARY KEY ("ID") ENABLE
)

CREATE OR REPLACE TRIGGER "BI_HIBERTEST"
before insert on "HIBERTEST"
for each row
begin
select "HIBERTEST_SEQ".nextval into :NEW.ID from dual;
end;


Pro pouhé uložení záznamu vám stačí nastavit IDčku hodnotu -1 (pro zachování nullable=false) a Oracle to přeplácne za Vás. Potíž nastane v okamžiku, kdy chcete s onou zaperzistentněnou beanou dál pracovat a mít v ní ono ID. Naštěstí bratr Google opět pomohl.
Jean-Pol Landrain napsal velice triviální a nádherný PostInsertGenerator, který to řeší velice elegantně. Podívejte se sami.
Pak stačí entitě v IDEA přidat anotaci

@GeneratedValue(generator="triggerAssigned")
@GenericGenerator(name="triggerAssigned",
strategy = "jpl.hibernate.util.TriggerAssignedIdentityGenerator")

a je vymalováno.

IDEA 7 aneb Tak dlouho jsem se bránil hibernate, až se ucho utrhlo

Nastoupil jsem do nového zaměstnání - do hradišťské firmy BARCO a začal psát J2EE aplikaci postavenou nad SQL. O hibernate jsem nechtěl ani slysšet, protože když jsem naposledy viděl jeho konfiguraci, jímala mne hrůza a běs.
Ale nainstaloval jsem si novou IntelliJ IDEA, IMHO nejlepší nástroj na vývoj aplikací v Javě, která podporu Hibernate v sobě obsahuje. Tak jsem to zkusil. V Oracle XE konzoli jsem si nadefinoval tabulku, dal do ní cvičně jeden řádek a zkoušel jsem, co s tím IDEA dokáže za kouzla. A byl jsem mile přeqapen.
Postup je velice jednoduchý. Ze všeho nejdřív si v projektu nadefinujte DataSource ukazující na onu tabulku (Menu->Tools->Data Sources..., nezapomeňte na Refresh Tables jako já :-) ). Pak vytvoříte v projektu nový modul typu Hibernate, zasociujete jej s Data Sources, přidáte Deskriptor (IDEA sama nabídne jediný možný ;-) ) a potvrdíte. Pro modul víc nepotřebujete.
Poté se už jenom v projektovém navigátoru přepnete do pohledu Java EE: Structure, kliknete na nový Hibernate projekt a v kontextovém menu vyberete Generate Persistence Mapping->By Database Schema a pak jen zíráte.