- Použil jsem připojení k databázi Sybase v které jsem volal proceduru. Na vstupu procedury byl parametr typu int. Mapování v xml vypadalo následovně:
psc bylo typu Integer. Mapoval jsem tedy java.lang.Integer z javy na int z databáze. Výsledkem byla následující chyba:<select id="getPostOffice" statementType="CALLABLE" parameterType="biz.prodejna.pasport.PostRequest" resultType="java.lang.Integer"> {call search_post (#{psc})} </select>
Řešením je explicitní uvedení databázového typu pomocí jdbcType:Cause: java.sql.SQLException: JZ006: Caught IOException: java.io.IOException: JZ0SL: Unsupported SQL type 1111. ; SQL []; JZ006: Caught IOException: java.io.IOException: JZ0SL: Unsupported SQL type 1111.; nested exception is java.sql.SQLException: JZ006: Caught IOException: java.io.IOException: JZ0SL: Unsupported SQL type 1111.
<select id="
getPostOffice
" statementType="CALLABLE" parameterType="biz.prodejna.pasport.PostRequest" resultType="java.lang.Integer"> {call search_post (#{psc,jdbcType=INTEGER})} </select>
Pozor na přebytečné mezery. Pokud budou mezery např. kolem znaku "=" nebo za čárkou, vznikne chybaorg.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Často se volá procedura/select, jejíž výsledek je třeba namapovat na třídu. Názvy členských proměnných třídy se však vždy neshodují s názvy sloupců jež jsou výstupem z databáze. K tomu účelu je v MyBatis anotace @Results. Zde je ukázka použití, kde místo předchozího mapování v xml je použita anotace v rozhranní mapperu:
@Select("{call psc_detail_post (#{psc})}") @Results(value = { @Result(property = "psc"), @Result(property = "premisesName", column = "nazev_provozovny"), @Result(property = "municipality", column = "obec"), @Result(property = "municipalityPart", column = "cast_obce"), @Result(property = "street", column = "ulice"), @Result(property = "descriptiveNumber", column = "cislo_popisne"), @Result(property = "descriptiveCharacter", column = "cislo_popisne_znak"), @Result(property = "landmarkNumber", column = "cislo_orientacni"), @Result(property = "landmarkCharacter", column = "cislo_orientacni_znak"), @Result(property = "email"), @Result(property = "phone", column = "telefon")}) biz.prodejna.pasport.PostResponse getDetailPost(Integer psc);
Zde stojí za povšimnutí parametry psc a email. Jelikož se shodují názvy členských proměnných a výstupních sloupců, není třeba uvádět parametr column.
pátek 16. listopadu 2012
Několik tipů pro MyBatis 3
Ač je uživatelská příručka MyBatis 3 napsaná přehledně, lze se setkat s některými problémy či možnostmi, které jsou v ní uvedeny pouze okrajově nebo vůbec.
úterý 23. října 2012
Nastavení citlivosti myši v Ubuntu 12.04
Koupil jsem si novou myš s rozlišením1600 dpi. Po připojení k počítači byla ale příliš rychlá. Nastavení citlivosti v Unity nefunguje. Osvědčil se mi však následující postup:
- Spustit příkaz
Výpis bude podobný tomuto:xinput --list --short
Povšimněme si názvu myši, zde "ELECOM ELECOM LASER MOUSE".⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ ELECOM ELECOM LASER MOUSE id=8 [slave pointer (2)] ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Power Button id=7 [slave keyboard (3)] ↳ USB Keyboard id=9 [slave keyboard (3)] ↳ USB Keyboard id=10 [slave keyboard (3)] ↳ USB 2.0 Camera id=11 [slave keyboard (3)]
- Spustíme příkaz pro zpomalení. Defaultně je hodnota 1. Čím vyšší číslo, tím větší zpomalení myši. Mě vyhovovala hodnota 4.
xinput --set-prop "ELECOM ELECOM LASER MOUSE" "Device Accel Constant Deceleration" 4
- Vypnutí zrychlení myši. V mém případě byla 1 defaultní hodnota
xinput --set-prop "ELECOM ELECOM LASER MOUSE" "Device Accel Velocity Scaling" 1
- Pokud uvedené řešení funguje, můžeme si nastavit spouštění skriptu při přihlášení. Stačí vytvořit soubor např.
s obsahemgedit ~/.xinitrc
Povolit jeho spouštění příkazem#!/usr/bin/env bash xinput --set-prop "ELECOM ELECOM LASER MOUSE" "Device Accel Constant Deceleration" 4 xinput --set-prop "ELECOM ELECOM LASER MOUSE" "Device Accel Velocity Scaling" 1
a přidat do "Aplikace po spuštění..."chmod +x ~/.xinitrc
čtvrtek 31. května 2012
RESTful webová služba 1. díl
- Nainstaluji si server glassfish. Ten je možné zdarma získat např. zde. Stačit vám bude ale i Tomcat nebo jiný servletový kontejner.
- Vytvořím si v Netbeans novou webovou aplikaci: V tomto okně je třeba dát Add a následně vybrat nainstalovaný servletový kontejner.
- Nyní je třeba nakonfigurovat aplikaci. To je možné dvěma způsoby:
- Prostřednictvím souboru web.xml
- Pomocí anotace @ApplicationPath
- A nyní konečně mohu napsat nějakou svoji třídu. RESTful webovou službu mohu volat jako bezparametrickou nebo s parametry. V druhém případě mám v podstatě 3 možnosti, jak parametry vkládat:
- Jako součást URL. Příklad: http://localhost:8080/example-rest/resources/names/jmeno/prijmeni
- Jako parametry metody GET. Příklad: http://localhost:8080/example-rest/resources/names?jmeno=Adam&prijmeni=Oliva
- V těle HTTP requestu. Zde mohou být parametry naformátovány v libovolném MIME typu.
- Nyní je už možné aplikaci deployovat na server a zkusit ji zavolat např. z webového prohlížeče: http://localhost:8080/example-rest/resources/names/Adam/Oliva
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>JerseyServlet</servlet-name>
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JerseyServlet</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
</web-app>
1: package biz.prodejna.examples.rest;
2:
3: import javax.ws.rs.ApplicationPath;
4: import javax.ws.rs.core.Application;
5:
6: @ApplicationPath("resources")
7: public class JaxRsConfig extends Application {
8: }
V tomto bodě ukáži pouze první případ. Další případy si nechám do některého z dalších dílů.
1: package biz.prodejna.examples.rest;
2:
3: import javax.ws.rs.GET;
4: import javax.ws.rs.Path;
5: import javax.ws.rs.PathParam;
6: import javax.ws.rs.Produces;
7:
8: @Path("names")
9: public class Names {
10:
11: @GET
12: @Path("{first}/{last}")
13: @Produces("text/plain")
14: public String getFullName(
15: @PathParam("first") String firstName, @PathParam("last") String lastName) {
16: return firstName + " " + lastName;
17: }
18: }
Vysvětlím jednotlivé anotace:
@Path u třídy udává, pod jakou URL bude služba dostupná.
@GET definuje, jaká bude použita HTTP metoda.
@Path u metody definuje, jaké bude pořadí parametrů. Nebo přesněji: jaký tvar bude mít zbytek URL.
@Produces udává MIME typ v těle HTTP odpovědi.
@PathParam mapuje parametry metody na části v anotaci @Path
Proč URL vypadá právě takhle? Vysvětlím:
example-rest -název aplikace
resources -definováno ve web.xml nebo anotací @ApplicationPath
names -definováno anotací třídy @Path
- služba vracející odpověď jako xml
- služba očekávající parametry jako parametry URL
- tvorba klienta s využitím implementace Jersey.
- služba očekávající na vstupu XML dokument.
pátek 30. března 2012
GlassFish V3 admin console se načítá příliš dlouho
Pokud máte nainstalovaný GlassFish V3 za proxy a chcete se přihlásit do administrátorské konzole, nejspíš musíte čekat na úvodní obrazovku dosti dlouhou dobu. V logu je pak výpis podobný tomuto:
1) Do souboru %GLASSFISH_HOME/glassfish/domains/domain1/domain.xml přidejte následující jvm-option:
2) Odstraňte (raději si ho někam zálohujte) update tool jar z umístění %GLASSFISH_HOME/glassfish/modules/console-updatecenter-plugin.jar
3) Pokud máte čistou instalaci, můžete si dovolit odstranit složky %GLASSFISH_HOME/glassfish/domains/domain1/osgi-cache a %GLASSFISH_HOME/glassfish/domains/domain1/generated. Postup mi fungoval i bez tohoto bodu.
4) %GLASSFISH_HOME/bin/asadmin [re]start-domain
admin console: initSessionAttributes()
Cannot refresh Catalog : Connection timed out
Tohoto neduhu se lze zbavit následujícím postupem:1) Do souboru %GLASSFISH_HOME/glassfish/domains/domain1/domain.xml přidejte následující jvm-option:
<jvm-options>-Dcom.sun.enterprise.tools.admingui.NO_NETWORK=true</jvm-options>
2) Odstraňte (raději si ho někam zálohujte) update tool jar z umístění %GLASSFISH_HOME/glassfish/modules/console-updatecenter-plugin.jar
3) Pokud máte čistou instalaci, můžete si dovolit odstranit složky %GLASSFISH_HOME/glassfish/domains/domain1/osgi-cache a %GLASSFISH_HOME/glassfish/domains/domain1/generated. Postup mi fungoval i bez tohoto bodu.
4) %GLASSFISH_HOME/bin/asadmin [re]start-domain
čtvrtek 8. března 2012
EJB jar včetně závislostí
Potřeboval jsem vytvořit EJB jar v němž měly být obsaženy také všechny závislosti. V mém případě MyBatis a Spring Framework. Pro buildování používám maven. Do výsledného jaru samozřejmě nelze zabalit přímo další jary, je třeba je nejprv rozbalit. To vyřešil mavenovský plugin maven-dependency-plugin přidaný do pom.xml. Zajímavá je v tomto místě především jeho část execution:
<execution>
<id>unpack-dependencies</id>
<phase>process-classes</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<!--Definuji co se ma rozbalit do vysledneho jaru-->
<includeGroupIds>org.springframework,org.mybatis</includeGroupIds>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
Aby byly přibalené závislosti také v classpath, vypadala definice pluginu maven-ejb-plugin následovně: <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.3</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
<ejbVersion>3.1</ejbVersion>
</configuration>
</plugin>
Výsledkem celého snažení ovšem byla nicneříkající chyba:Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 9 in XML document from URL [file:.../META-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
Naštěstí jsem narazil na blogspot, který tento problém řeší následovně: "stačí" ze všech použitých springových jarů vybrat soubory META-INF/spring.handlers a META-INF/spring.schemas a sloučit je pouze do dvou. Tyto dva dát do adresáře META-INF a celé to zabalit do jaru. Výsledný jar, pak umístit do lib aplikačního serveru. V případě použití novější verze springu může být třeba tyto soubory doeditovat.
čtvrtek 12. ledna 2012
SSL na více virtuálních serverech v rámci jednoho serveru glassfish
Poblém, který následující řádky řeší je přístup přes https na více domén (druhého řádu) v rámci jednoho glassfishe, kdy domény jsou definovány v rámci virtuálního serveru. Používat více serverových certifikátů na jednom glassfishi v rámci jedné domény možné není. Více o problému zde.
Uvedený problém je řešitelný vydáním certifikátu odpovídající standardu RFC-2818 (http://www.ietf.org/rfc/rfc2818.txt) následujícím způsobem: V CN bude název jednoho z požadovaných názvů virtuálního serveru. Ostatní názvy virtuálních serverů budou v položce "Alternativní jména subjektu certifikátu" (SubjectAltName), kde je možné umístit jednu nebo více položek dNSName případně iPAddress nebo uniformResourceIdentifier. Tomuto podobných řešení existuje více (např. využití regulárního výrazu v CN), uvedené má ovšem nejlepší interoperabilitu (http://wiki.cacert.org/VhostTaskForce#Interoperability_Test).
Podle zmíněného standardu je možné v dNSName využívat i hvězdičkovou konvenci. Navíc definuje, že CN je použito jako identita až v případě, že není definováno rozšíření subjectAltName typu dNSName. Používání CN je zastaralé a RFC-2818 namísto toho certifikačním autoritám doporučuje používat dNSName.
Přihlásit se k odběru:
Příspěvky (Atom)