Posts Tagged ‘java’

OpenLaszlo 4.9 is Available

Monday, November 1st, 2010

OpenLaszlo 4.9 is now available for download.
+info!

_o/
Icon The Rolling Stones

How to Configure and Use Bean with Spring Annotation, part 1

Saturday, October 23rd, 2010

Vamos direto ao ponto! Enquanto meu Mac tá ali baixando algumas cositas, vou deixar uma dica esperta, rápida e fácil de configurar Bean com Spring Annotation para a injeção de dependência.
#1 - Configure seu Bean:

package br.eti.web4u.service;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
@Scope("singleton")
public class MeuService {
  @Bean(name="casa")
  public Casa getCasa() {
    //do something
  }
}

Para configurar um Serviço, basta utilizar a annotation Configuration e o seu Bean injection, basta utilizar a annotation Bean no método. Neste caso o serviço está configurando um Bean chamado de “casa”.
Veja que você pode configurar o Scopo do serviço, para isto utilize Scope e diga qual tipo de escopo.

#2 - Como chamar? Neste exemplo, usei um Servlet para realizar a chamada.

package br.eti.web4u.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.eti.web4u.service.MeuService;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MeuServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
 
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    AnnotationConfigApplicationContext context =  new AnnotationConfigApplicationContext(MeuService.class);
   
    Casa casa = (Casa)context.getBean("casa");

                //do something
  }
}

Lembrando que ao instanciar a variável context, ela será do tipo singleton. Ou seja, você pode chamar várias vezes os seus bean que estão configurados mas seu construtor será executado somente 1 vez.
Utilize a criatividade e bole algo legal ai!

_o/
Icon The Rolling Stones

How to use PostConstruct Annotation of Spring

Thursday, October 21st, 2010

You can call methods to run essential services and load others resources that not be executed through Spring dependency injection.
To do this, you need configure a PostConstruct annotation in each method that you need call. Does not only one, but many methods.
Bellow you can see a Bean with 2 PostContruct annotation to run after construct default method.
Test it!

Utilizar Spring Annotations facilitou muito a configuração de Beans e serviços que são utilizados através da injeção de dependência.
Ao configurar um Bean utilizando annotations do Spring, você tem a oportunidade de configurar um ou vários métodos para ser executado no momento que seu Bean for carregado, ou seja, depois que o método construtor padrão ou personalizado é executado.
Para utilizar esta funcionalidade basta utilizar a annotation PostConstruct antes de cada método que se deseja executar.
Veja um exemplo prático e simples:

import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
@Scope("singleton")
public class TesteService {
 
  public TesteService() {
    System.out.println("Construtor TesteService");
  }
 
  @PostConstruct
  public void postConstruct() {
    System.out.println("Post Construct");
  }
 
  @PostConstruct
  public void postConstruct2() {
    System.out.println("Post Construct 2");
  }
        //Outros métodos | Others functionality
}

Quando você chamar esta classe utilizando a injeção de dependência, logo depois de executar o construtor TesteService, os métodos postConstruct e postConstruct2 serão executados.
Essa funcionalidade é bem legal, pois agiliza e deixa para o conteiner chamar estes métodos para carregar outros serviços essenciais, como por exemplo, abrir conexão com banco ou até mesmo utilizar algum design pattern proxy para carregar uma serviço separado.

_o/
Icon The Rolling Stones

Expert Training for Spring, Rio de Janeiro 2010

Thursday, October 21st, 2010

Core Spring is 4-day flagship Spring Framework training course. In this course, students build a Spring-powered JEE application that demonstrates the Spring Framework and other Spring technologies in an intensely productive, hands-on setting.

Completion of this course entitles each student to waive the registration fee for the SpringSource Certified Professional Examination and it is also the ideal preparation for the exam.

+info!

_o/
Icon The Rolling Stones

How to Use Commons Digester Annotation 2.1

Saturday, October 16th, 2010

Hey, now Commons Digester is so easy and more useful to read Xml datas.
The last version of Commons Digester allow you configure the tags of an Xml content through Java annotations.
Some time ago, i showed how configure and create your self Java annotation here!
See code below _o/

As anotações do JEE5 realmente são muito legais e extremamente usefull.
Tanto que diversas tecnologias que vivem ao redor do mundo JEE estão evoluindo e adicionando annotations em suas funcionalidades.
As annotations maximiza consideravelmente o desenvolvimento de componentes, permite que configurações sejam feitas sem a utilização de arquivos XML e é um poderoso meio de injetar componentes dentro de outros componentes.
Algum tempo atrás publiquei um post ensinando a criar você mesmo sua annotation em Java. É simples e se você tiver uma imaginação fértil e uma boa arquitetura certamente irá criar uma annotation poderosa em suas aplicações.

Recentemente o Apache Commons Digester lançou uma nova versão de sua biblioteca, onde foi evoluido o projeto e sua configuração é feita através de annotations. Ficou bastante fácil utilizar o Commons Digester com as annotation para ler arquivos XML.
No site oficial tem um exemplo de leitor de feed de Blogs. Peguei este exemplo e segui, e em menos de 5 minutos coloquei pra rodar sem dificuldade alguma. Vale a pena ver como está!
Resolvi deixar o mesmo exemplo aqui, mas com a classe Java main completa(com o método public static void main).

Primeiramente, vamos dar uma olhada na estrutura de um XML de um feed de um Blog. Se você acessar o feed do Web4u, poderá ver a estrutura é, simplificamente, assim:

<rss>
.......<channel>
.............<title />
.............<link />

.............<item>
..................<title />
..................<link />
.............</item>


.............<item>
..................<title />
..................<link />
.............</item>

.......</channel>
</rss>

Vamos agora criar uma classe básica do nó Channel:

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester.annotations.rules.BeanPropertySetter;
import org.apache.commons.digester.annotations.rules.ObjectCreate;
import org.apache.commons.digester.annotations.rules.SetNext;

@ObjectCreate(pattern="rss/channel")
public class Channel {
  @BeanPropertySetter(pattern = "rss/channel/title")
  private String title;
  @BeanPropertySetter(pattern = "rss/channel/link")
  private String link;
 
  private final List<Item> itens = new ArrayList<Item>();
 
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getLink() {
    return link;
  }
  public void setLink(String link) {
    this.link = link;
  }
  public List<Item> getItens() {
    return itens;
  }
 
  @SetNext
  public void addItem(Item item) {
    this.itens.add(item);
  }
}

Veja que usamos a annotation @ObjectCreate, para definir o nó do XML. Usamos as annotations @BeanPropertySetter para definir os itens de valores deste nó, e usamos a annotation @SetNext para definir o método que irá setar os Itens, ou seja, os Posts do Blog.

Agora vamos para a classe Item.java que irá ser utilizar e encapsulada pelo Channel. Esta classe utiliza as mesmas annotations da classe acima:

import org.apache.commons.digester.annotations.rules.BeanPropertySetter;
import org.apache.commons.digester.annotations.rules.ObjectCreate;

@ObjectCreate(pattern = "rss/channel/item")
public class Item {
  @BeanPropertySetter(pattern = "rss/channel/item/title")
  private String title;
 
  @BeanPropertySetter(pattern = "rss/channel/item/link")
  private String link;

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getLink() {
    return link;
  }

  public void setLink(String link) {
    this.link = link;
  }
}

Vamos a classe main. Nesta classe main coloquei configurado para ler os feeds do Blog Webu, mas vocês podem alterar para ser qualquer feed de outro Blog se sua preferência. Como é uma simples aplicação Java, coloquei para printar os resultados na tela mesmo utilizando o System.out.println(”").
Para você conseguir rodar este exemplo é necessário que no seu Classpath contenha o caminho para o Jar do projeto Commons Digester versão 2.1(commons-digester-2.1.jar) e de suas 2 dependências, que são o Commons BeanUtils 1.8.3(commons-beanutils-1.8.3.jar) e do Commons Loggin 1.1.1(commons-logging-1.1.1.jar).
Segue a classe de fácil entendimento:

import java.net.URL;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.annotations.DigesterLoader;
import org.apache.commons.digester.annotations.DigesterLoaderBuilder;

public class Teste {

  public static void main(String[] args) {
    DigesterLoader digesterLoader = new DigesterLoaderBuilder().useDefaultAnnotationRuleProviderFactory().useDefaultDigesterLoaderHandlerFactory();
    Digester digester = digesterLoader.createDigester(Channel.class);
    try {
      Channel channel = (Channel) digester.parse(new URL("http://www.web4u.eti.br/feed/").openStream());
      System.out.println(channel.getTitle());
      System.out.println(channel.getLink());
     
      for(Item item : channel.getItens()) {
        System.out.println("*********************");
        System.out.println( item.getTitle() );
        System.out.println( item.getLink() );
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Já era easy, agora ficou hiper easy utilizar o Commons Digester.
Então fica aqui a dica, quando for criar um componente personalizado para ler XML em Java não se esqueça do Commons Digester.

_o/
Icon The Rolling Stones

Spring Web Flow 2.2.0 Released

Saturday, October 16th, 2010

Now Spring Web Flow give JSF 2 support.
+info!

_o/
Icon The Rolling Stones

JPA Query: ‘%Like%’

Tuesday, October 5th, 2010

Lembrete rápido!
Resolvendo rápido a paradinha da consulta JPA com as clausulas where usando like.

Não precisa colocar no seu SQL assim: … where p.name like ‘%:name%’

Coloque somente assim: … where p.name like :name
Mas daí coloque no seu parâmetro desta forma:

query.setParameter("name", "%Fred%");

Ou seja, concatene no início e no final da String desejada o símbolo %.
Deixe de quebrar a cabeça, pesquise + pergunte!
_o/
Icon The Rolling Stones

Auto-increment no HypersonicSQL

Sunday, October 3rd, 2010

Depois de alguns minutos perdido tentando criar uma tabela na unha no Hypersonic resolvi deixar aqui a dica pra quem estiver apanhando com as colunas Auto-increment.
As colunas, normalmente primary key, auto-increment no Hypersonic são conhecidas como IDENTITY.

Um exemplo de sql:

CREATE TABLE Pessoa ( id Integer NOT NULL PRIMARY KEY IDENTITY, nome varchar(100) NOT NULL );

Pronto!
Fica aqui a dica pra quem está apanhando. :D
Icon The Rolling Stones

Iniciando com JPA

Sunday, October 3rd, 2010

Fala ae Pessoal, tudo bom? Espero que sim.

Essa semana alguns amigos me perguntaram sobre dicas de como iniciar com JPA. Então vou deixar um link super legal de um vídeo no blog da Caelum. Vale a pena ver!

Inté!
Icon The Rolling Stones

Clash of converters org.directwebremoting.convert.BeanConverter

Wednesday, July 28th, 2010

When you receive this exception on dwr, you must take off the described line below that isduplicate.

<convert converter=" ...

Sometimes this exception is launched because you have two entries with same name to distinct classes names.
Remove it!

Quem ai é desenvolvedor Java já deve ter passado pelo problema de utilizar o Dwr e receber a seguinte exceção:
Clash of converters Using org.directwebremoting.convert.BeanConverter in place of org.directwebremoting.convert.BeanConverter

Então, hoje tive esse problema. E como o arquivo de configuração do Dwr(dwr.xml) do projeto que estou trabalhando é gigante, não tinha olhado muito para ele, pois a minha IDE não estava reclamando de erros no xml.

Mas vendo a mensagem de erro melhor, vi que o erro era uma entrada duplicada no arquivo dwr.xml na seguinte linda:

<convert converter=" ...

Ou seja, esta linha tinha duas ocorrências que estava com o nome lógico apontando para classes diferentes.
Retirado a duplicidade, o erro foi embora.
Bom, fica a dica.
Fiz este pq percebi muita gente mundo a fora com o mesmo problema, mas ninguém deu uma resposta objetiva, então fica aqui a dica de um dos possíveis problemas que causa esta Exception.

Valeu _o/
Icon The Rolling Stones