barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 18 июля 2013 г.

Oracle: "SELECT ... INTO ..." и ошибка "No data found"

В случае, если есть вероятность, что запрос, используемый в SELECT ... INTO ..., не вернет строк, можно либо указать обработчик исключения, либо воспользоваться следующей конструкцией, которая в случае, если запрос не вернет строк, запишет NULL в переменную my_var:
SELECT (SELECT some_field FROM some_table WHERE <some_condition>) INTO my_var FROM dual

validate-медиатор на WSO2ESB 4.5.1 и MTOM: NullPointerException

Проблема:

При валидации сообщения с помощью медиатора <validate>  в случае, когда сообщение содержит MTOM-оптимизированное вложение, валится исключение:
java.lang.NullPointerException
at org.apache.axiom.om.impl.llom.OMTextImpl.getTextCharacters(OMTextImpl.java:272)
at org.apache.axiom.om.impl.serialize.OMXMLReader.generateEvents(OMXMLReader.java:284)
at org.apache.axiom.om.impl.serialize.OMXMLReader.generateEvents(OMXMLReader.java:254)
at org.apache.axiom.om.impl.serialize.OMXMLReader.generateEvents(OMXMLReader.java:251)
at org.apache.axiom.om.impl.serialize.OMXMLReader.parse(OMXMLReader.java:171)
at org.apache.axiom.om.impl.serialize.OMXMLReader.parse(OMXMLReader.java:161)
at org.apache.xerces.jaxp.validation.ValidatorHandlerImpl.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)
at javax.xml.validation.Validator.validate(Unknown Source)
at org.apache.synapse.mediators.builtin.ValidateMediator.mediate(ValidateMediator.java:180)
at ...
at java.lang.Thread.run(Thread.java:722)
Причина:

Это известная проблема библиотеки Axiom, есть соотв. баг на баг-трекере (https://issues.apache.org/jira/browse/AXIOM-442), который исправлен в версии 1.2.14, тогда как в WSO2 ESB 4.5.1 используется версия 1.2.11.

воскресенье, 14 июля 2013 г.

Как запретить изменять размер textarea в Firefox / Chrome

Firefox / Chrome позволяют изменять размер <textarea>, потянув за нижний правый угол. Это не всегда удобно и может ломать дизайн сайта, в таких случаях нужно отключить такое поведение с помощью css-свойства resize:
textarea {
    resize: none;
    }

вторник, 9 июля 2013 г.

MS Word: 2010 разная ориентация для разных страниц документа

Если просто менять ориентацию страницы через Page Layout --> Orientation, она меняется у всего документа сразу. Чтобы действие применялось только к текущей странице, нужно перед ней (и после неё) вставить "Next Page" с помощью Page Layout --> Breaks --> Next Page.

суббота, 6 июля 2013 г.

Weblogic 10.3.5: connection pooling в веб-приложении

Когда-то давно писал об организации connection pool'а в веб-приложении, разворачиваемом на Tomcat 6, на этот же раз возникла необходимость в аналогичном решении для Weblogic 10.3.5.
Ниже описан случай, когда WAR-ник деплоится в составе EAR-ника.
Во-первых, необходимо создать в EAR-нике xml-файл с конфигурацией пула. Поместить его в принципе можно где угодно, я разместил в META-INF/datasources/ и назвал mydb-jdbc.xml. Содержимое у него примерно следующее (на примере Oracle):
<jdbc-data-source xsi:schemaLocation="http://www.bea.com/ns/weblogic/90/domain.xsd"
 xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source"
 xmlns:sec="http://www.bea.com/ns/weblogic/90/security"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:wls="http://www.bea.com/ns/weblogic/90/security/wls">
  <name>mydb-datasource</name>
  <jdbc-driver-params>
    <url>jdbc:oracle:thin:@//db_host:db_port/db_servicename</url>
    <driver-name>oracle.jdbc.OracleDriver</driver-name>
    <properties>
      <property>
        <name>user</name>
        <value>*****</value>
      </property>
      <property>
        <name>password</name>
        <value>*****</value>
      </property>
    </properties>
  </jdbc-driver-params>
  <jdbc-connection-pool-params>
    <max-capacity>20</max-capacity>
    <connection-reserve-timeout-seconds>25</connection-reserve-timeout-seconds>
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
  </jdbc-connection-pool-params>
</jdbc-data-source>
Тут в целом все достаточно очевидно. 
После создания данного файла нужно добавить ссылку на него в дескриптор приложения (META-INF/weblogic-application.xml в EAR-нике):
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://xmlns.oracle.com/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://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.0/weblogic-application.xsd">
  <module>
    <name>mydb-datasource-module</name>
    <type>JDBC</type>
    <path>META-INF/datasources/mydb-jdbc.xml</path>
  </module>
</weblogic-application>
Теперь осталось лишь в web.xml WAR-ника, входящего в EAR, добавить ссылку на соотв. ресурс:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
  <!-... -->
  <resource-ref>
    <res-ref-name>mydb-datasource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>
Все, теперь в коде WAR-ника коннекты к БД получаются так:
    InitialContext ctx = new InitialContext();
    javax.sql.DataSource ds =
            (javax.sql.DataSource) ctx.lookup("java:comp/env/mydb-datasource");
    conn = ds.getConnection();


Деплой EAR на Weblogic 10.3.5: Filtering class loader configuration ignored for web module

Проблема

Есть enterprise-приложение, содержащее внутри WAR-ник. При деплое EAR-ника на Weblogic 10.3.5 в логах появляется warning:
<Warning> <HTTP> <BEA-101377> <Filtering class loader configuration ignored for web module ***.war of application ***>
Помимо этого, почему-то игнорируются <prefer-application-packages> из weblogic.xml, размещенного в /WEB-INF WAR-ника.

Причина

Конфигурация фильтрующего загрузчика классов должна размещаться в дескрипторе основного  развертываемого артефакта (weblogic-application.xml в EAR-нике), а не в weblogic.xml WAR-ника (http://docs.oracle.com/cd/E24329_01/doc.1211/e26117/chapter_bea_messages.htm).

Решение

Перенести настройку фильтрации классов в weblogic-application.xml EAR-ника.


Weblogic 10.3.5 + Netbeans 7.3: WSP_1018_POLICY_EXCEPTION_WHILE_FINISHING_PARSING_WSDL

Проблема:

В Netbeans 7.3 создано веб-приложение, содержащее веб-сервис (который создавался с помощью соотв. мастера) и собираемое maven-ом. При развертывании приложения на Wevlogic 10.3.5 валится исключение:
weblogic.application.ModuleException: ...
...
javax.xml.ws.WebServiceException: [failed to localize] WSP_1018_POLICY_EXCEPTION_WHILE_FINISHING_PARSING_WSDL()
...
Caused by: com.sun.xml.ws.policy.PolicyException:[failed to localize] WSP_1014_POLICY_REFERENCE_DOES_NOT_EXIST
...
Причина:

Netbeans включил в pom-ку приложения зависимость webservices-rt как compile, в то время как Weblogic имеет свою имплеменацию jax-ws. Именно наличие в CLASSPATH двух имплементаций приводит к данной ошибке (я правда не понял почему именно, но не суть).

Решение:

Изменить scope зависимости webservices-rt на provided:
    <dependency>
      <groupId>com.sun.xml.ws</groupId>
      <artifactId>webservices-rt</artifactId>
      <version>1.4</version>
      <scope>provided</scope>
    </dependency>
Спасибо http://relativelyprime.blogspot.ru/2010/05/netbeans-68-weblogic-1033-and-jax-ws.html