пятница, 26 августа 2011 г.

Java Polymorphism issue



public class XXX {

    @Test
    public void test() {
        B b = new B();
        b.doY();
    }
}



class A {
    public void doY() {
        XProcedure.doX(this);
    }
}


class B extends A {

    public void doY() {
        super.doY();
        XProcedure.doX(this);
    }
}


class XProcedure {

    public static void doX(A a) {
        System.out.println("AAAA!");
    }

    public static void doX(B b) {
        System.out.println("BBBB!");
    }
}


What is output =) ?


Answer:
AAAA!
BBBB!








среда, 10 августа 2011 г.

SOAPFaultException на платформах .NET и Java, опыт работы с JAX-WS

На днях поимел опыт работы с вебсервисами из коробки-моробки JAX-WS.


1. Все исключения выбрасываемые эндпоинтом нужно делать кастомными и аннотировать
@WebFault(name = "CRUDSoapException", targetNamespace = "wsdl.xxx")
см. блог Eben Hewitt 

Иначе на клиента вываливается SOAPFaultException с кускокм строкового говна, который как бы описывает иксэпшн.

2. Все исключения  выбрасываемые эндпоинтом приходят на платформу .NET в виде строкового
 говна (обёрнутого в SOAPFaultException) в не зависимости от способа объявления на эндпоинте.

3.JAX-B может зажевать исключения возникающие при сериализации, и чтобы таки их увидеть нужно включить такой параметр в запуск программы  -Djavax.net.debug=all

4. JAX-B не умеет сериализовать прокси объекты Hibernate (да и вообще - наверное любые сгенерённые прокси). Бороть  так converting-hibernate-proxy-to-real-object
5. JAX-B не умеет сериализовать интерфейсы.  Если есть необходимость использовать интерфейс можно сделать абстрактный класс реализующий этот интерфейс и обвесить его JAX-B аннотациями(@XmlSeeAlso - с указанием классов). В дальнейшем в коде можно будет использовать этот интерфейс добавив для него частный @XmlJavaTypeAdapter, который будет тупо преобразовывать абстрактный класс в интерфейс.