четверг, 25 октября 2012 г.

Mixin multiple JVM languages in the enterprise

It is interesting, has anybody tried to mixin multiple languages in the enterprise java project?

Scala, Closure, jRuby or others? 
Did it really help to speedup the the development and support?

пятница, 12 октября 2012 г.

Tomcat 6. Remove version information from error pages.

When Tomcat 6 encounters error like 404 it displays the error page which also reveals Tomcat version. It is bad in production, because some people can attack vulnerabilities in software. So, to make this task difficult it is better to mimic the version information in error page.

In your CATALINA_BASE\lib directory create dirs org/apache/catalina/util. Then, create the file ServerInfo.properties with the following properties:
server.info=Apache
server.number=1.2.3.4
server.built=18 nov 2012 23:59:59
 
Restart the Tomcat. Now Tomcat error pages won't contain version information.

Question to readers

Hi folks! I need your help. Does anybody of you knows the Java User Group in Moscow? I would like to join in to exchange the experience.

I know Google has video presentations from their java related meetings. Are there any meetings like this are held in Moscow?

вторник, 2 октября 2012 г.

Важное объявление.

С целью расширения аудитории  своего блога дальнейшие записи будут вестись на английском языке.

понедельник, 1 октября 2012 г.

Spring и сервлеты. Инъектирование бинов.

Порой очень хочется, чтобы при создании сервлета автоматически инъектировались бины Spring.
Однако стоит отметить важную особенность, что жизненным циклов бинов управляет Spring, а жизненным циклом сервлета управляет контейнер сервлетов.  По этой причине автоматически инъектировать бины в сервлет не получится.



Есть альтернативное решение. Spring содержит интерфейс
org.springframework.web.HttpRequestHandler. В этом интерфейсе есть метод handleRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response). Фактически это один в один метод service сервлета. Мы портируем наш сервлет так, что класс реализует данный интерфейс. Этот класс мы объявляем в spring. Далее в web.xml мы создаём описание сервлета. При этом имя сервлета должно совпадать с именем определённого бина spring, а класс сервлета - org.springframework.web.context.support.HttpRequestHandlerServlet.

Как результат - наш сервлет содержит инъектированные бины spring.

Аналогичное решение есть и для фильтров сервлета. Только в этом случае класс называется org.springframework.web.filter.DelegatingFilterProxy.

суббота, 22 сентября 2012 г.

Установка приложений на Tomcat с помощью ant.

При разработке приложения для работы на Tomcat очень удобной возможностью является установка приложения на Tomcat с помошью скрипта ant.
Удобство заключается в небольшом количестве действий, которое необходимо для установки приложения.
Установку можно выполнить на любой сервер, локальный или удалённый.

Почитать об этом можно в руководстве на Tomcat, но для удобства опишу основные моменты здесь:

1) Необходимо скопировать файл server/lib/catalina-ant.jar из Tomcat в каталог с библиотеками ant ($ANT_HOME/lib).
2) В Tomcat прописать учётную запись для пользователя manager-script.
3) В ant скрипте необходимо объявить задачи tomcat и параметры установки приложения:
<!-- Configure the directory into which the web application is built -->
    <property name="build"    value="dist"/>
    <!-- Configure the context path for this application -->
      <property name="path"     value="/test"/>

      <!-- Configure properties to access the Manager application -->
      <property name="url"      value="http://localhost:8080/manager"/>
      <property name="username" value="duglas"/>
      <property name="password" value="password"/>

      <!-- Configure the custom Ant tasks for the Manager application -->
      <taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask" />
      <taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask"/>

   
<target name="deploy" description="Install web application"
              depends="war">
        <deploy url="${url}" username="${username}" password="${password}"
                path="${path}" war="file:${build}/springwstest.war"/>
      </target>

  <target name="undeploy" description="Remove web application">
        <undeploy url="${url}" username="${username}" password="${password}"
                path="${path}"/>
      </target>

4) После этого можно вызывать нужную цель, и приложение будет установлено на сервере. Вызов цели undeploy влечёт за собой удаление приложение на сервере.

Spring Web Services. Тестирование клиента к веб-сервису.

Автономное тестирование клиента к веб-сервису без самого сервиса позволяет получить уверенность в том, что клиент работает как в стандартных ситуациях, так и не очень.
К стандартным ситуациям следует отнести ситуацию, когда сервис выдаёт ожидаемый ответ.
К нестандартным ситуациям следуюет отнести ситацию, когда сервис выдает исключение.

В нашем распоряжении есть следующее ПО:
  1. jUnit 4.10
  2. Spring WS 2.1.0 
  3. Eclipse
Рассмотрим следующий пример сервиса. На вход принимается две строки, на выходе выдаётся их склейка. Для тестирования клиента используется класс MockWebServiceServer. Перед вызовом клиента нам необходимо установить последовательность пар вызовов и ответов веб-сервиса.

Это осуществляется в строке: mockServer.expect(RequestMatchers.payload(expectedRequestPayload)).andRespond(ResponseCreators.withPayload(responsePayload)); 

Далее мы осуществляем вызов нашего клиента к веб-сервису, и в конце теста
вызываем метод mockServer.verify(). Этот метод проверяет, что веб-сервис получил все ожидаемые запросы от клиента. Если какие-то запросы не пришли, то unit тест не пройдёт.

За более подробным описанием предлагаю обратиться к описанию класса MockWebServiceServer.
Также можно прогнать пример ниже.

 @RunWith(SpringJUnit4ClassRunner.class)  
 @ContextConfiguration("/context.xml")  
 public class MyWebServiceClientIntegrationTest {  
   @Resource(name="webServiceTemplate")  
   org.springframework.ws.client.core.WebServiceTemplate webServiceTemplate;  
   private MockWebServiceServer mockServer;  
   @Before  
   public void createServer() throws Exception {  
     mockServer = MockWebServiceServer.createServer(webServiceTemplate);  
   }  
   @Test  
   public void testExpected() throws Exception {  
     String request = "<ConcatRequest xmlns=\"http://www.chernykh.ru/myfirst\">"+  
         "<p1>1</p1>"+  
         "<p2>2</p2>"+  
         "</ConcatRequest>";  
     String request2 = "<ConcatRequest xmlns=\"http://www.chernykh.ru/myfirst\">"+  
         "<p1>1</p1>"+  
         "<p2>2</p2>"+  
         "</ConcatRequest>";  
     String response = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ConcatResponse xmlns=\"http://www.chernykh.ru/myfirst\"><out>12</out></ConcatResponse>";  
     Source expectedRequestPayload =  
         new StringSource(request);  
     Source responsePayload = new StringSource(response);  
     mockServer.expect(RequestMatchers.payload(expectedRequestPayload)).andRespond(ResponseCreators.withPayload(responsePayload));  
     ByteArrayOutputStream output = new ByteArrayOutputStream();   
     StreamResult result = new StreamResult(output);  
     String uri = "http://localhost:8080/test/service";  
     webServiceTemplate.sendSourceAndReceiveToResult(uri,new StringSource(request2), result);  
     String resultStr = "";   
     resultStr = new String(output.toByteArray(), UTF_8.utf8);  
     mockServer.verify();  
     System.out.println("Finished:"+resultStr);  
   }  
 }  

вторник, 18 сентября 2012 г.

Spring + MongoDB + Eclipse. Проблема с spring-mongo-1.0.xsd.


При использовани Spring + Mongo в Eclipse последний ругается на файл с бинами Spring.

<beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          xsi:schemaLocation=
          "http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/data/mongo
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

Детальная ошибка говорит: "Cannot resolve the name 'repository:repository' to a(n) 'type definition' component" вspring-mongo-1.0.xsd.

Решение нашёл в замечательной заметке: http://stackoverflow.com/questions/11684673/spring-mongo-1-0-xsd-error.

Нужно изменить   http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd на
  http://www.springframework.org/schema/data/mongo/spring-mongo-1.1.xsd. После этого eclipse перестанет ругаться на проект.

воскресенье, 9 сентября 2012 г.

Spring + MongoDb. Первое знакомство.

В одном из моих проектов мне понадобилось использовать mongodb в качестве хранилища данных сессии пользователя.

Для работы на java с mongodb можно использовать java драйвер. Это довольно утомительное занятие. Поэтому я нашёл интересный проект spring-data-mongodb, который позволяет упростить работу с mongodb.