Merhabalar,
Java webservis client üretirken birçok zaman client üretmek bir kabus haline dönüşebiliyor. Farklı webservis implementasyonları farklı sonuçlar üretebiliyor, örneğin bir wsdl için axis ile üretilen client çalışırken diğeri için wsimport ile üretilen client başarılı olabilmektedir. Burada alınabilecek birçok çeşit hata vardır, authentication hatası, collision hatası, constructor hatası vs. Bu hataların çözümü için elbette hatanın kök nedenini iyi analiz etmek gerekiyor, bunun için tecrübe ile ya da google ile sonuç alınabiliyor :)
Benim bahsedeceğim hatayı almamın sebebi, bir sebeple client sınıflarını tek paket altında toplama ihtiyacım ve bu pakette farklı object factory'de olması gereken sınıfların aynı object factory'de çakışma yaşamasıdır. Hatanın kısaca açıklaması şu şekilde,
Two declarations cause a collision in the ObjectFactory class.
Bunu çözmek için, çakışan sınıflardan en az bir tanesi için binding tanımlayarak bunun object factory'deki metod ismine müdahale ediyoruz, pom'da binding tanımlanışı ve binding dosyasındaki tanımlamalar aşağıdaki gibidir.
pom.xml
...
..
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<target>2.1</target>
<bindingFiles>
<bindingFile>${basedir}/src/main/resources/binding.xml</bindingFile>
</bindingFiles>
</configuration>
<phase>generate-sources</phase>
</execution>
</executions>
..
...
binding.xml
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<jaxb:bindings schemaLocation="https://dene.me.com/DenemeWS/DenemeService?xsd=3">
<jaxb:bindings node="//xs:element[@name='Exception']">
<jaxb:factoryMethod name="Exception2"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
Herkese iyi çalışmalar dilerim ;)
31 Ekim 2014 Cuma
JaxWS Client Üretme Çakışma Hataları
19 Ocak 2014 Pazar
JSF Log Interceptor
Selamlar,
JSF bean'lerinde loglama yapmak için, eğer sınıftaki tüm fonksiyonlar için yapılacaksa sınıfın üstüne, spesifik fonksiyon için ise bu fonksiyon üzerine kendi yazdığımız custom bir anotasyon konulur, örneğin,
@MyLog
anotasyonu konulur. Daha sonra Log işlemini yapacak sınıf yazılır.
@MyLog
@Interceptor
public class LogInterceptor implements Serializable{
@AroundInvoke
public Object log(InvocationContext ic) {
Object result = null;
System.out.println(ic.getMethod.getName());
try{
result = ic.proceed();
} catch(Exception e)
}
}
LogInterceptor class'ını CDI beans.xml'inde interceptor olarak tanıtmak gerekir.
JSF bean'lerinde loglama yapmak için, eğer sınıftaki tüm fonksiyonlar için yapılacaksa sınıfın üstüne, spesifik fonksiyon için ise bu fonksiyon üzerine kendi yazdığımız custom bir anotasyon konulur, örneğin,
@MyLog
anotasyonu konulur. Daha sonra Log işlemini yapacak sınıf yazılır.
@MyLog
@Interceptor
public class LogInterceptor implements Serializable{
@AroundInvoke
public Object log(InvocationContext ic) {
Object result = null;
System.out.println(ic.getMethod.getName());
try{
result = ic.proceed();
} catch(Exception e)
}
}
LogInterceptor class'ını CDI beans.xml'inde interceptor olarak tanıtmak gerekir.
JSF'de session'a parametre atama
Selamlar,
JSF'de session'a parametre atamak veya atanan parametreyi almak için, ServletRequest'i HttpServletRequest'e cast ederek setAttribute fonksiyonunu kullanabiliriz.
HttpServletRequest req = (HttpServletRequest) servletRequest;
req.getSession().setAttribute(String key, Object obj);
Örneğin WebListener olan sınıflarda kullanılabilir.
JSF'de session'a parametre atamak veya atanan parametreyi almak için, ServletRequest'i HttpServletRequest'e cast ederek setAttribute fonksiyonunu kullanabiliriz.
HttpServletRequest req = (HttpServletRequest) servletRequest;
req.getSession().setAttribute(String key, Object obj);
Örneğin WebListener olan sınıflarda kullanılabilir.
JSF page load fonksiyonu & HttpSessionListener
Selamlar,
ASP'deki gibi page_laod fonksiyonunu JSF'de kullanmakmisteyenler
@WebFilter(urlPatterns={/*})
anotasyonunu kullanabilirler. Anotasyonun kullanıldığı sınıf javax.servlet.Filter interface'ini implement etmelidir.
Aynı anotasyonla HttpSessionListener implement edilerek session olaylarına bağlı fonksiyonlar çalıştırılabilir, örneğin session kapatılırken yapılacak spesifik işlemler burada yapılabilir.
ASP'deki gibi page_laod fonksiyonunu JSF'de kullanmakmisteyenler
@WebFilter(urlPatterns={/*})
anotasyonunu kullanabilirler. Anotasyonun kullanıldığı sınıf javax.servlet.Filter interface'ini implement etmelidir.
Aynı anotasyonla HttpSessionListener implement edilerek session olaylarına bağlı fonksiyonlar çalıştırılabilir, örneğin session kapatılırken yapılacak spesifik işlemler burada yapılabilir.
13 Ocak 2014 Pazartesi
Hayat Kurtaran Bilgiler Serisi - 5 - wsimport ile webservice client üretirken çakışmaları giderme
Merhabalar,
wsimport ile client üretirken bazen xsd'lerden kaynaklanan çakışmalar yaşanabilmektedir. Bunları önlemek için komuta aşağıdaki kısım eklenirse, çakışan sınıfları otomatik olarak farklı isimlendirecek, böylece hem wsimport komutu çalışırken, hem de client kodu weblogic'e deploy edilirken, alınacak hatalar önlenmektedir.
wsimport -keep -verbose -B-XautoNameResolution http://localhost:7001/myw/MyService?WSDL
Maven wsimport plugin kullanıyorsanız, aşağıdaki şekilde eklenebilir,
<execution>
<id>execution</id>
<goals>
<goal>wsimport</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<args><arg>-B-XautoNameResolution</arg></args>
<wsdlUrls>
<wsdlUrl>${"WSDL_ADDRESS_HERE"}</wsdlUrl>
</wsdlUrls>
<packageName>MY_PACKAGE_NAME</packageName>
</configuration>
</execution>
Herkese iyi çalışmalar.
wsimport ile client üretirken bazen xsd'lerden kaynaklanan çakışmalar yaşanabilmektedir. Bunları önlemek için komuta aşağıdaki kısım eklenirse, çakışan sınıfları otomatik olarak farklı isimlendirecek, böylece hem wsimport komutu çalışırken, hem de client kodu weblogic'e deploy edilirken, alınacak hatalar önlenmektedir.
wsimport -keep -verbose -B-XautoNameResolution http://localhost:7001/myw/MyService?WSDL
Maven wsimport plugin kullanıyorsanız, aşağıdaki şekilde eklenebilir,
<execution>
<id>execution</id>
<goals>
<goal>wsimport</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<args><arg>-B-XautoNameResolution</arg></args>
<wsdlUrls>
<wsdlUrl>${"WSDL_ADDRESS_HERE"}</wsdlUrl>
</wsdlUrls>
<packageName>MY_PACKAGE_NAME</packageName>
</configuration>
</execution>
Herkese iyi çalışmalar.
Etiketler:
Hayat Kurtaran Bilgiler Serisi,
Java,
JaxWS
12 Ocak 2014 Pazar
JDK wsimport ile Jaxws webservis client'i ile webservis çağırma
Merhabalar,
wsimport ile ürettiğiniz webservis client'larından aşağıdaki şekilde request yapabilirsiniz.
MyService_Service service = new MyService_Service(
this.getClass()
.getResource(
"/com/abc/webservices/wsdls/Mywsdl.wsdl"),
new QName("http://mobile..abc.com/",
"MyService"));
MyService port = service.getMyServiceImplPort();
try {
((BindingProvider) port)
.getRequestContext()
.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"https://localhost:7001/myContext/MyService?WSDL");
// ((BindingProvider) port).getRequestContext().put(
// BindingProvider.USERNAME_PROPERTY, "myusername");
// ((BindingProvider) port).getRequestContext().put(
// BindingProvider.PASSWORD_PROPERTY, "mypassword");
// ((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS,
// Collections.singletonMap("Content-Type",Collections.singletonList("text/xml")));
} catch (Exception e) {
throw e;
}
com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true;
port.calculate(3,5);
Herkese iyi günler.
wsimport ile ürettiğiniz webservis client'larından aşağıdaki şekilde request yapabilirsiniz.
MyService_Service service = new MyService_Service(
this.getClass()
.getResource(
"/com/abc/webservices/wsdls/Mywsdl.wsdl"),
new QName("http://mobile..abc.com/",
"MyService"));
MyService port = service.getMyServiceImplPort();
try {
((BindingProvider) port)
.getRequestContext()
.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"https://localhost:7001/myContext/MyService?WSDL");
// ((BindingProvider) port).getRequestContext().put(
// BindingProvider.USERNAME_PROPERTY, "myusername");
// ((BindingProvider) port).getRequestContext().put(
// BindingProvider.PASSWORD_PROPERTY, "mypassword");
// ((BindingProvider)port).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS,
// Collections.singletonMap("Content-Type",Collections.singletonList("text/xml")));
} catch (Exception e) {
throw e;
}
com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true;
port.calculate(3,5);
Herkese iyi günler.
Hayat Kurtaran Bilgiler Servisi - 3 - Weblogic preload sınıfları yerine projenin sınıflarını kullanma
Merhabalar,
Projenizi weblogic'e yükledikten sonra weblogic'de bulunan ve kullanılan sınıflar yerine, örneğin javax.jws.* sınıfları, projenizde bulunan ya da dependency'lerinden gelen sınıfların kullanılmasını istiyorsanız,
EAR'ınızda bulunan weblogic-application.xml dosyasına aşağıdaki gibi kayıtlar eklenmelidir.
<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-application
xmlns:wls="http://www.bea.com/ns/weblogic/weblogic-application"
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/javaee_5.xsd http://www.bea.com/ns/weblogic/weblogic-application http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd">
<wls:application-param>
<wls:param-name>webapp.encoding.default</wls:param-name>
<wls:param-value>UTF-8</wls:param-value>
</wls:application-param>
<wls:prefer-application-packages>
<wls:package-name>javax.el.*</wls:package-name>
<wls:package-name>com.sun.el.*</wls:package-name>
<wls:package-name>antlr.*</wls:package-name>
<wls:package-name>org.apache.commons.*</wls:package-name>
<wls:package-name>org.apache.xmlbeans.*</wls:package-name>
<wls:package-name>org.springframework.*</wls:package-name>
<wls:package-name>javax.validation.*</wls:package-name>
<wls:package-name>org.hibernate.*</wls:package-name>
<wls:package-name>org.hibernate.validator.*</wls:package-name>
<wls:package-name>javax.persistence.spi.*</wls:package-name>
<wls:package-name>javax.persistence.criteria.*</wls:package-name>
<wls:package-name>javax.persistence.metamodel.*</wls:package-name>
<wls:package-name>javax.persistence.*</wls:package-name>
<wls:package-name>org.slf4j.impl*</wls:package-name>
<wls:package-name>org.slf4j.helpers*</wls:package-name>
<wls:package-name>org.slf4j.spi.*</wls:package-name>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
</wls:weblogic-application>
Burada dikkat edilmesi gereken husus, eklediğiniz paketler altında bulunan sınıflar ile, weblogic'in geri kalan sınıfları arasında uyumsuzluk olmamasıdır. Eğer eklediğiniz paketler projenizin kütüphanelerinden geliyorsa, bu kütüphanelerin nversiyon uyumluluğuna dikkat etmelisiniz.
Herkese iyi günler.
Projenizi weblogic'e yükledikten sonra weblogic'de bulunan ve kullanılan sınıflar yerine, örneğin javax.jws.* sınıfları, projenizde bulunan ya da dependency'lerinden gelen sınıfların kullanılmasını istiyorsanız,
EAR'ınızda bulunan weblogic-application.xml dosyasına aşağıdaki gibi kayıtlar eklenmelidir.
<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-application
xmlns:wls="http://www.bea.com/ns/weblogic/weblogic-application"
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/javaee_5.xsd http://www.bea.com/ns/weblogic/weblogic-application http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd">
<wls:application-param>
<wls:param-name>webapp.encoding.default</wls:param-name>
<wls:param-value>UTF-8</wls:param-value>
</wls:application-param>
<wls:prefer-application-packages>
<wls:package-name>javax.el.*</wls:package-name>
<wls:package-name>com.sun.el.*</wls:package-name>
<wls:package-name>antlr.*</wls:package-name>
<wls:package-name>org.apache.commons.*</wls:package-name>
<wls:package-name>org.apache.xmlbeans.*</wls:package-name>
<wls:package-name>org.springframework.*</wls:package-name>
<wls:package-name>javax.validation.*</wls:package-name>
<wls:package-name>org.hibernate.*</wls:package-name>
<wls:package-name>org.hibernate.validator.*</wls:package-name>
<wls:package-name>javax.persistence.spi.*</wls:package-name>
<wls:package-name>javax.persistence.criteria.*</wls:package-name>
<wls:package-name>javax.persistence.metamodel.*</wls:package-name>
<wls:package-name>javax.persistence.*</wls:package-name>
<wls:package-name>org.slf4j.impl*</wls:package-name>
<wls:package-name>org.slf4j.helpers*</wls:package-name>
<wls:package-name>org.slf4j.spi.*</wls:package-name>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
</wls:weblogic-application>
Burada dikkat edilmesi gereken husus, eklediğiniz paketler altında bulunan sınıflar ile, weblogic'in geri kalan sınıfları arasında uyumsuzluk olmamasıdır. Eğer eklediğiniz paketler projenizin kütüphanelerinden geliyorsa, bu kütüphanelerin nversiyon uyumluluğuna dikkat etmelisiniz.
Herkese iyi günler.
Etiketler:
Hayat Kurtaran Bilgiler Serisi,
Java,
JaxWS
Hayat Kurtaran Bilgiler Serisi - 2 - JaxWS webservisleri için dump
Merhabalar,
Jaxws web servislerinizde client üretip bağlantı denediğinizde request ve response'i server logunda görmek için aşağıdaki satırı kodlarınıza eklemeniz yeterlidir.
com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true;
Kolay gelsin.
Jaxws web servislerinizde client üretip bağlantı denediğinizde request ve response'i server logunda görmek için aşağıdaki satırı kodlarınıza eklemeniz yeterlidir.
com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true;
Kolay gelsin.
Etiketler:
Hayat Kurtaran Bilgiler Serisi,
Java,
JaxWS
Kaydol:
Kayıtlar (Atom)