четверг, 31 мая 2012 г.

Запрос Hibernate, только с нужными полями


Имеем Entity User и entityManager в одном ejb

public class User implements Serializable{
         private Integer id;
         private String firstName;
 далее еще много других полей этого юзера, которые нам не интересны.
 }

 Хотим следующий запрос
 Select u.id, u.firstname from User u
 Такой запрос вернет объект вида: Object [], а хотим объект типизированный.

 Допустим есть слой ДТО в другом ejb

package com;

 public class TestPojo implements Serializable{

//создаем конструктор с 2-мя полями, поле firstName в этом классе это title
 public TestPojo(int id, String firstName) {
this.id = id;
title = firstName;
}
}

 Query query = entityManager.
                         createQuery("Select new com.TestPojo(u.id,u.firstName) FROM User u");
List<TestPojo> testPojoList=query.getResultList();

 Смотрим логи и видим что достаются только те поля, которые нужны.
 select
        user0_.id as col_0_0_,
        user0_.firstname as col_1_0_
    from
        tbl_users user0_

пятница, 23 марта 2012 г.

REST Services with EJB 3.1


В Java EE 6 REST (JAX-RS) технология стала частью платформы. В данной статье будет рассмотрено, как это работает, на примере EJB 3.1. Необходим Application server, поддерживающий EJB 3.1, например, JBoss 6.0.0 GA, так же Eclipse c поддержкой 6 версии JBoss (если нет, то скачать отдельный плагин и установить).
Создаем в Eclipse новый EJB проект, называем restEJB, выбрать нужный сервер (6.0).  Затем веб-проект, выбираем Dynamic Web Project - restWeb.

В ejb-модуле будет интерфейс ActionLocal, с 2 методами:
package com;

import javax.ejb.*;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;

@Local
@Path("/somePath")
public interface ActionLocal {

     // метод http-запроса
     @GET
     @Path("/getJson")
//указываем в каком формате вернуть ответ и в какой кодировке
     @Produces("application/json;charset=utf-8")   
public Response getJson(@QueryParam("id") String id);

     @POST
     @Path("/postJson")
     @Produces("application/json;charset=utf-8")   
     public Response postJson(@FormParam("id") String id,
              @FormParam("name") String name);
}

Сам бин:
@Stateless
public class ActionBean implements ActionLocal {

     @Override
     public Response getJson(String id) {
         Book book = new Book(id);
         return Response.status(200).entity(book).build();
     }

     @Override
     public Response postJson(String id, String name) {
         Book book = new Book(id, name);
         return Response.status(200).entity(book).build();
     }
}

Модель представлена классом Book

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Book {

     private String bookId = null;
     private String name = null;

     public Book() {
     }
    
     public Book(String bookId) {
         this.bookId = bookId;
     }
    
     public Book(String bookId, String name) {
         this.bookId = bookId;
         this.name = name;
     }
…геттеры и сеттеры полей

С Ejb-модулем все готово. Теперь web-проект:
немного подправим web.xml

//без указания бина работать в JBoss-е не будет, хотя должно работать и без этих значений
<context-param>
     <param-name>resteasy.jndi.resources</param-name>
     <param-value>ActionBean/local</param-value>
</context-param>

<listener>
<listener-class> org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
     <servlet-name>Resteasy</servlet-name>
<servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name>Resteasy</servlet-name>
     <url-pattern>/somePath/*</url-pattern>
</servlet-mapping>

Порядок деплоя: сначала ejb-модуль, потом war-модуль.
Для обработки get-запроса больше ничего не нужно писать и можно проверить приложение набрав в браузере: http://localhost:8080/restWeb/somePath/getJson?id=9  Разные браузеры по-разному отображают вернувшийся ответ, например, в Google Chrome можно увидеть {"name":null,"bookId":"9"}
Вариант с post-запросом.
Создадим страничку index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Form</title>
<script type="text/javascript" src="js/jquery-1.7.1.min.js">jQuery.noConflict();</script>
</head>
<body>
            <form id="formAction" action="somePath/postJson">
                        <input type="text" name="id" placeholder="Book id..." /> <br />
                        <input type="text" name="name" placeholder="Name..." /> <br />
                        <input type="submit" value="Submit" />
            </form>
            <div id="result"></div>
            <script type="text/javascript">
jQuery.ajaxSetup({contentType:"application/x-www-form-urlencoded;charset=utf-8"})
            $("#formAction").submit(function(event) {
                event.preventDefault();
                var $form = $( this ),
                bookId = $form.find( 'input[name="id"]' ).val(),
                name = $form.find( 'input[name="name"]' ).val(),
        url = $form.attr( 'action' );
                $.post( url, { id: bookId, name: name},
                        function( data ) {
                           $( "#result" ).empty().append( '<table border="1"><tr><td>'
                            + data.bookId + '</td><td>' + data.name + '</td></tr></table>');
                        }
                        );
              });
</script>
</body>
</html>
JQuery так же можно указать так: src=http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js, если есть подключение к Интернету. Можно проверять. В браузере набрать http://localhost:8080/restWeb/index.html, заполнить поля и отправить.
Если что-то не получилось, скачайте архив, и задеплойте приложения, внутри проектов так же можно найти исходные коды.
Проект с исходными кодами можно скачать Отсюда