0

Como injetar POJOs em um SessionBean via Spring?

-

É fato que a especificação EJB3 trouxe uma enorme facilidade para o desenvolvimento de aplicações Java EE, porém, ainda sinto falta de algumas simplicidades, como por exemplo: “Como injetar um POJO em um SessionBean?” Ok, mas porque eu iria querer fazer isso ? E outra, fiquei sabendo que tem injeção de dependência em EJB3 via annotations, pra que colocar outro container de IoC, como o Spring ?

Ótimas perguntas! Então, vamos lá:

Em primeiro lugar, o IoC do EJB3 só funciona para recursos controlados pelo container, tais como: EJBs, Datasources, Filas, Topicos, etc. Ou seja, se você quiser injetar um POJO, no seu SessionBean, infelizmente não existe uma annotation @POJO, para fazer isso.

Com isso, podemos concluir que para tirar proveito da IoC do seu servidor de aplicação Java EE favorito, você deveria transformar todos os seus objetos de negócio em objetos gerenciados pelo container (traduzindo, EJB), mas isso nem sempre é desejado ou permitido (no caso de você utilizar uma classe ou jar de terceiros, ou compartilhar um modulo com outro projeto que não utiliza EJB). Então, o que fazer ? Simples: AOP!

AOP ?!?! Sim, mas calma, a solução é bem mais simples do que parece. Basta criar uma annotation (@Spring, por exemplo) e implementar o seu próprio interceptor, que irá carrega o seu xml do spring com as definições dos beans (seu applicationContext.xml) e injetá-los, onde estiver marcado com a annotation criada.

A sua annotation poderia ser:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Spring {
        String bean();
}

A mágica:

Aqui vai um exemplo bem simples de interceptor que carrega as configurações do applicationContext, e sai injetado os beans do spring onde tiver uma propriedade anotada com @Spring:

public class SpringInterceptor {

	// AplicationContext - Spring
	private static ApplicationContext appCtx = new ClassPathXmlApplicationContext("applicationContext.xml");

	@PostConstruct
	// O Método anotado com PostConstructor deve receber um parametro (InvocationContext),
	// nao deve lançar exceção e o retorno deve ser void
	public void init(InvocationContext invocationContext) {

		// Obtém o session bean que terá as propriedades injetadas
		Object o = invocationContext.getTarget();

		Field[] fields = o.getClass().getDeclaredFields();
		try {
			for (int i = 0; i < fields.length; i++) {

				if (fields[i].isAnnotationPresent(Spring.class)) {
					// Seta o atributo como acessível (sim, quebra o encapsulamento =p )
					fields[i].setAccessible(true);
					// Obtém o nome do Bean e o busca no contexto do spring (ApplicationContext)
					Spring springAnnotation = fields[i].getAnnotation(Spring.class);
					// Injeta o SpringBean(POJO) na propriedade do SessionBean
					fields[i].set(o, appCtx.getBean(springAnnotation.bean()));
				}
			}
		} catch (Exception e) {
                        // Tá, isso pode ser bem melhor ;p
			e.printStackTrace();
		}
	}
}

O Segredo:

Note que toda a lógica do interceptor está no método anotado com @PostConstruct, ou seja o pós-construtor do interceptor. Na verdade este nosso interceptor não intercepta nenhuma chamada. Ele apenas é construído, e na sua construção, injeta os pojos que definimos no arquivo applicationContext.xml. Legal né?

Modo de usar:

Para usar, você tem que indicar, no seu SessionBean, que irá utilizar o interceptor criado:

@Stateless
@Interceptors(value = SpringInterceptor.class)
public class MySessionBean implements MySession {

	@Spring(bean="MyBean")
	private MyBean MyBeanImpl;

        ...
}

Neste caso, a nossa annotation funciona apenas para propriedades (Fields), mas é facilmente expansível para métodos, o que fica como "lição de casa".

2

A grande surpresa do iPhone é… O preço!

-

O que todos esperavam aconteceu, Steve Jobs anunciou ao mundo a nova versão do iPhone compatível com 3G. Será que o Steve está perdendo o “elemento surpresa”, tão característico de sua pessoa ? Acho que não, pois a surpresa ficou mesmo pelo preço do iPhone: 199 doletas a versão 8GB e 299 a versão 16GB. É mole ? Com a cotação do dolar (paralelo) a 1.67, um iPhone 8GB custa 327,78 Reais. Na loja submarino um celular motorola v3 com câmera VGA, toque mp3, 5MB de memória interna (não há possibilidade de expansão) custa 449 Reais.

Além de mim, alguém mais acredita que o iPhone irá dominar o mundo num curtíssimo prazo ?

Eu gosto muito da nokia, inclusive tenho um N95, que é fantástico, mas devo admitir que se ela não apresentar algo muito revolucionário, rápido e barato, verá suas ações despencarem. É inconcebíbel uma empresa deste calibre, que fez um celular tão magnifico quanto o N95, não apresentar nada realmente novo nos ultimos 10 meses.

0

Deixando o seu GEdit com a cara do TextMate

-

Existem vários tutoriais sobre isso na net, mas aqui vou fazer uma compilação e falar o que funcionou para mim.

Para começar, estou utilizando ubuntu 8.04 (Hardy Heron) com gnome 2.22. Portanto, não sei se este tutorial vale para todos os linux disponíveis por ai.

Um bom lugar de partida é este tutorial do site grigro.org. O tutorial é bem completo.

A única ressalva para este tutorial, é que os plugins devem ser colocados no dir /usr/lib/gedit-2/plugins. Se colocar no local indicado pelo autor, não irá funcionar.

Passo 2. Instalando a fonte.

A fonte utilizada no TextMate é a Liberation Mono, que pode ser encontra para download aqui. Após baixá-la e descompactá-la, rode:

sudo mkdir /usr/share/fonts/truetype/liberation

e depois copie todos os arquivos .ttf para o diretório criado e rode o comando:

sudo fc-cache

Desta forma a nova fonte estará disponível para todos que utilizarem o sistema. Agora basta abrir o gedit e selecioná-la. Sugiro que deixe com tamanho 11.

Qualquer dúvida, é só me escrever.

2

Ubuntu at Work

-

Ubuntu at WorkBom, estou tentando diminuir minhas horas de utilização do Windows. Minha primeira iniciativa foi instalar ubuntu no meu dell inspiron, o que foi bem simples. Faltou apenas instalar o drive da ATI (vi EnvyNG, ficou teta) e o Wifi, para o qual utilizei NDisWrapper.

O Segundo passo foi tentar colocar o Ubuntu no meu desktop no trampo. Achei que aqui seria mais fácil, pois não tem Wifi, e por outro lado imaginei que teria problemas para configurar rede, logar no dominio, etc. Me enganei duas vezes. A parte de configurar a rede foi muito simples, não precisei fazer nada, o ubuntu detectou tudo e tudo ja estava funcionando. Entretanto, como pode ser visto na foto, eu utilizo dois monitores, e até agora não consegui configurá-los da maneira que gostaria (placa de video ATI X600). Consegui utilizar os dois, e para isso o ubuntu estava utilizando uma resolução de 3mil e pouco por 1050, só que para essa resolução, não funciona o Compiz.

Mas não vou deixar isso me abater. Amanha tenho que chegar as 5 da manhã aqui no trampo, e ai vou ter bastante tempo para conseguir achar uma solução =p

2

My first blog from N95

-
Testando a ferramenta Wavelog para logar diretamente do meu Nokia N95. Por se tratar de uma versão de testes, não suporta conteúdo multimedia.