terça-feira, 2 de julho de 2013

JBoss AS 7 - Cluster SSO

Oi pessoal : )

Eu montei um ambiente com vários JBoss AS 7 em cluster, a replicação de sessão estava funcionando perfeitamente, porém, o user principal (usuário logado) não estava replicando para os outros nós do cluster.

Achei na documentação que para isso funcionar precisavam ser feitas mais alguns ajustes:

https://access.redhat.com/site/documentation/en-US/JBoss_Enterprise_Application_Platform/6.1/html/Development_Guide/Use_Single_Sign_On_SSO_In_A_Web_Application.html

mas seguindo a documentação não funcionou :(

os pré-requisitos são os mesmos.. existem apenas duas coisas erradas na documentação:

1) cache-container="web"
O script abaixo está errado:
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")

o correto é:
/profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web")

(Lembrando que você deve alterar o nome do perfil para o perfil que você está utilizando, e caso você esteja no standalone deve retirar o /profile=ha do comando)

2) Valve
Você não deve adicionar nenhum valve no seu jboss-web.xml pois a classe ClusteredSingleSignOn é instanciada automaticamente.

Pronto! Funcionou perfeitamente!

Fonte: https://community.jboss.org/message/825375#825375

Abraços!
Adriano Schmidt

segunda-feira, 24 de junho de 2013

Caixa de ferramentas do arquiteto Java


Gosto de uma definição antiga que pode ser usada até hoje:

“O arquiteto ideal deve ser uma pessoa erudita, um matemático, familiarizado com estudos históricos, um estudioso aplicado de filosofia, conhecedor de música, que não desconheça medicina, detentor de saber jurídico e familiarizado com astronomia e cálculos astronômicos.“ (Vitruvius, 25 A.C.)

Eu tenho trabalhado como consultor em muitos clientes e tenho que tomar diversas decisões arquiteturais sobre tecnologias e ferramentas e também sobre ALM (Application Lifecycle Management). Estou fazendo este post para falar de algumas ferramentas que temos à nossa disposição e que devemos conhecer.

Vale lembrar que a escolha das tecnologias e ferramentas sempre depende de inúmeras variáveis, é necessário entender a aplicação, requisitos, objetivos e limitações para tomar a melhor decisão.

E ferramentas, na verdade, são úteis apenas com a definição de técnicas e de processos de forma adequada.

Enfim, vamos lá! Separei algumas ferramentas por tópicos:

Análise de requisitos, arquitetura e design

O mais importante na análise de requisitos são as técnicas utilizadas, conseguir obter o máximo de informações e detalhá-las conforme necessidade.

Uma ferramenta bem robusta é o Enterprise Architect (EA), porém, gasta-se muito tempo para trabalhar com esta ferramenta.

Existe a possibilidade de trabalhar com arquivos de texto como o Word, porém, não são documentos vivos, uma ideia interessante é utilizar uma ferramenta de wiki, como o xwiki por exemplo. O Confluence da Atlassian é muito bom também para documentação e compartilhamento de conhecimentos.

É interessante o uso de ferramentas para criação de fluxos e diagramas como o Astah (antigo Jude) e o Bizagi.

Para criação de protótipos eu sempre utilizo o Balsamiq Mockups, ele é fantástico! Existem outras opções como o Axure, que é um mais robusto, mas o Balsamiq é mais simples e atente em quase todas as situações.


Gerenciamento de Projetos

O MS Project é ótimo para gerar e organizar cronogramas.

O Jira (ou RedMine, que é basicamente uma versão free do Jira) é muito bom para gerenciar as atividades de um projeto. Você cadastra um projeto, coloca as atividades e o número de horas, delega para os responsáveis, e tem um visão bem clara de tudo que está acontecendo. Estas ferramentas também servem para registrar bugs, é possível visualizar quantos erros aconteceram, de qual tipo, tem diversos gráficos e formas de visualização. Você também pode criar um workflow com todos os passos e responsáveis para cada atividade. Caso você vá usar RedMine, sugiro a instalação do plugin Monitoramento e Controle para melhor visualização das atividades.

Se você for trabalhar com Agile o GreenHopper é uma ótima opção. O Trello é um software de kanban muito eficiente em que você pode organizar seus projetos, atribuir responsáveis, entre outras funcionalidades.

Se você precisa de um produto que seja integrado com a folha de pagamento, que gera relatórios para enviar aos clientes, você pode procurar sistemas próprios para isso, porém, talvez exista a necessidade de customização.


Criação de código (IDE)

Sou adepto da ideia que cada desenvolvedor deve ser livre para escolher sua IDE.

Eu sempre trabalho com o Eclipse, ou com o JBoss Developer Studio (que é o Eclipse com diversos plugins da JBoss), mas caso o desenvolvedor queira usar NetBeans, ou alguma outra IDE (IntelliJ IDEA por exemplo), ou até mesmo um editor de textos qualquer ele deve poder! Para isso deve ser utilizado o Maven, que, entre outras coisas, organiza o projeto para que ele possa ser utilizado com qualquer IDE, ou sem nenhuma.


Repositório de fontes

Há muito tempo era utilizado o CVS, porém, com o surgimento do SVN ele não é mais recomendado.

O SVN é simples de usar e muito eficiente e eficaz.

Caso você tenha uma equipe entusiasta por tecnologia e que abrace a ideia, é uma excelente ideia utilizar o GIT. Ele é mais complexo e mais difícil de aprender, no entanto, traz inúmeras vantagens.

Outra opção é o TFS para versionamento de fontes, mas acredito que ele é extremamente eficiente para projetos com tecnologias Microsoft, mas não para projetos Java, mesmo as versões mais novas do TFS.

Existe ainda o Mercurial, este eu não conheço muito, não conheço muitas empresas que o utilizam.

Existem diversos padrões, utilizados mundialmente, para versionamentos, criação de tags e branches, é de extrema importância definir este processo.


Build automation e Integração contínua

Recomendo a utilização do Jenkins, nele você pode rodar compilação automática, rodar scripts de testes, de validação de código e atualizar ambientes.

O Jenkins é free e opensource, ele sempre me atendeu 100%. Outra opção é o Bamboo, da Atlassian.


Qualidade

Para garantir a qualidade, além dos testes manuais (abrir a tela e verificar se está funcionando) existem outras formas de manter a qualidade como validação de fontes, testes unitários e testes de interface.

Estes testes e validações podem ser rodados automaticamente na integração contínua através do Maven, dessa forma você pode verificar a cada commit se algum teste parou de funcionar ou se alguma política de validação de fonte foi desreipeitada. Caso isso ocorra é enviado um e-mail para quem fez o commit e para os responsáveis pelo projeto.

Para validação de fontes recomendo a utilização de PMD e Checkstyle. Essas ferramentas verificam vários problemas no código. Existem plugins para o eclipse para utilização destas ferramentas. E elas também são rodadas via Maven (ou seja, independem de IDE). Para uma melhor visualização de tudo isso deve ser utilizado o Sonar, que oferece uma tela web para visualização de todos os problemas de código.

Para testes unitários o Arquillian é excelente! É interessante utilizar uma ferramenta que verifica quantas e quais linhas do seu fonte estão sendo cobertas pelos testes, para isso pode ser utilizado o Sonar ou o EclEmma ou o Atlassian Clover ou ainda alguma outra ferramenta.

Se o sistema for SAAS (ou se tiver uma grande preocupação com performance), é importante também escrever testes de desempenho utilizando ferramentas como JMeter, NewRelic, VisualVM, jConsole, entre outras.

Para testes de interface eu já utilizei o Visual Studio para projetos Java Web, achei muito bom, porém, a licença é cara. Quem conhece Java não terá dificuldade para trabalhar com ele, é utilizado C# para escrever os testes de tela. Uma opção free e bem semelhante às ferramentas de teste da Microsoft é o Selenium.

O ideal é estabelecer um processo de desenvolvimento onde sempre se escrevem testes automatizados e uma política de PMD e Checkstyle. Então para liberar uma versão, todos os testes automatizados devem rodar sem erros e a política estabelecida de PMD e Checkstyle deve ser atendida. Com certeza também é importante sempre fazer testes manuais, os próprios desenvolvedores podem testar o que outros desenvolvedores testaram, ou pode ser criada uma equipe de qualidade ou definir uma pessoa para ser tester.


Criação de Help On-line

Com um código bem documentado, é bacana a geração e publicação do JavaDoc. Através das ferramentas de validação de código é possível verificar se os códigos estão ou não documentados.

Mas é possível criar um help on-line de outras formas também, o xwiki é uma opção bacana!

Para a criação de help por página sistema de forma automática talvez exista alguma ferramenta para isso. É possível criar um mecanismo de links, tive que fazer isso em um produto e criei eu mesmo uma estrutura de documentação seguindo alguns padrões que eu defini.


I18n

Pode-se utilizar arquivos de textos, que é a opção mais simples. Porém, já trabelhei salvando as traduções em um banco de dados, é possível trabalhar com cache para melhorar a performance e fica muito bom também. Existem outras estratégias para corrigir problemas de performance com traduções.

Existe ainda a possibilidade de trabalhar com as traduções na Cloud, com a ferramenta transifex por exemplo.

Existem diversos padrões para serem seguidos com relação a tradução, para evitar problemas de formatos de campos, documentos, entre outras coisas.


Conclusão

Primeiro temos que definir ideias, definir o que queremos e o que é preciso de verdade. Após isso deve-se pensar em ferramentas para atender as necessidades.

Temos à nossa disposição inúmeras ferramentas, mas temos que entender melhor cada situação para utilizarmos as ferramentas adequadas.

Um grande abraço!
Adriano Schmidt

sábado, 22 de junho de 2013

JSF 2.2

E aí pessoal..

Hoje estava em um cliente que tem uma aplicação com JSF 2.1 e EJB 3.1 rodando no JBoss AS 7.

Essa aplicação tem centenas de acessos simultâneos e estávamos com problemas de uso de memória e de performance.

Sei que JSF talvez não seja a tecnologia mais adequada para projetos como esse, mas não poderíamos mudar isso agora.

Nós migramos a aplicação de JSF 2.1 para JSF 2.2 e tivemos muitos ganhos! O consumo de memória diminuiu consideravelmente! O GC conseguiu rodar melhor e limpar o heap bem mais do que fazia no JSF 2.1! Não sei se foi apenas por consequência do melhor uso da memória, mas a performance aumentou muito também!

Tudo isso foi constatado pelos próprios usuários e também por testes com o JMeter e com análises utilizando o VisualVM.

Enfim, fica a dica pessoal, usem o JSF 2.2!

Para implantar ele no JBoss AS 7 foi bem tranquilo! Nós seguimos este tutorial: http://www.marcusschiesser.de/2013/01/how-to-use-jsf-2-2-with-jboss-7-1/

Só um porém.. alguns componentes na aplicação tinham update="@form" ou update="idDeUmForm" e isso parou de funcionar no JSF 2.2 :/

Não sei o motivo.. aqui eram poucos casos e resolvemos alterando o update para atualizar o componente que devia ser atualizado e não todo o form.

Ao invés de update="@form" usamos update="idDoComponenteDentroDoFormQueTinhaQueSerAtualizado" : )

Abraços!!
Adriano Schmidt

sábado, 18 de maio de 2013

Certificação RHCJA - JBoss EAP 6

Olá pessoal!!

O Maurício Magnani (http://jbossdivers.wordpress.com/) está fazendo uma série de vídeo-aulas explicando tudo que cai na certificação RHCJA, eu estou assistindo todos os vídeos e fazendo um resumo de cada um para facilitar meus estudos.

Estou compartilhando aqui todas as minhas anotações de forma estruturada e de fácil entendimento para ajudar a todos que também queiram realizar esta certificação.

Recomendo assistirem todos os vídeos e depois estudarem por estes resumos para relembrar tudo o que foi visto.

Vamos lá!!

1) Introdução


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte1

  • Explicações sobre a prova
    • A prova é totalmente prática
    • Dura 4 horas
    • A única consulta que você pode fazer é a documentação do JBoss EAP. Saiba utilizá-la!
    • Você irá trabalhar em um sistema operacional Red Hat Enterprise Linux® 6 durante o exame
    • É importante ter um conhecimento básico de linux
    • A prova abordará assuntos de diversos módulos, para cada módulo o Maurício fez um vídeo explicando tudo o que você precisa saber.
    • A prova tem o valor aproximado de 400 dólares e, no Brasil, só pode ser feita em São Paulo.

2) Instalar o JBoss EAP em um local específico do sistema


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte2

  • Basta pegar o pacote do JBoss EAP (o arquivo .zip) e movê-lo para um local específico do sistema (/opt ou /usr/exam por exemplo, o local será especificado na prova) e descompactá-lo.
  • Na prova será dito onde está o jboss eap (por exemplo: /home/jboss/course-files/Versao Enterprise EAP 6\jboss-eap-6.0.1.zip) e será solicitado para instalá-lo em um local específico (/usr/local/jboss/exam por exemplo)
      • Verifique se esse local existe:
        • $cd /usr/local/jboss/exam
      • Caso não exista, crie-o:
        • $mkdir -p /usr/local/jboss/exam
      • Naveque até o diretório:
        • $cd /usr/local/jboss/exam
      • Copie o jboss para este diretório
        • $cp /home/jboss/course-files/Versao\ Enterprise\ EAP\ 6\jboss-eap-6.0.1.zip .
        • $ls
      • Descompacte o arquivo
        • $unzip jboss-eap-6.0.1.zip
        • $ls
      • Remova o pacote zip
        • $rm jboss-eap-6.0.1.zip
        • $ls
      • Mas se a prova disser que o root do jboss tem que ficar em "/usr/local/jboss/exam" você deve copiar tudo da pasta "/usr/local/jboss/exam/jboss-eap-6.0" para "/usr/local/jboss/exam"
        • $mv jboss-eap-6.0/* .
        • $rm -Rf jboss-eap-6.0
        • $ls
      • Teste indo até a raiz e iniciando o jboss
        • $cd /
        • $./usr/local/jboss/exam/bin/standalone.sh

3) Instalar outras bibliotecas nativas específicas do sistema operacional para aprimorar o desempenho do JBoss EAP


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte3

  • O native tem libs do hornetq e apr connector
  • Copie o zip (na prova será indicado onde ele estará, /home/jboss/course-files/Versao\ Enterprise\ EAP\ 6\jboss-eap-native-6.0.1-RHEL6-x86_64.zip por exemplo) para diretório /tmp (apenas para organização)
    • $cd /tmp
    • $cp /home/jboss/course-files/Versao\ Enterprise\ EAP\ 6\jboss-eap-native-6.0.1-RHEL6-x86_64.zip .
    • $ls
  •  Descompacte
    • $unzip jboss-eap-native-6.0.1-RHEL6-x86_64.zip
    • $ls
  • Copie as libs (.so) para a pasta do jboss
    • $cp -Rap jboss-eap-6.0/modules/org/hornetq/main/lib/* /usr/local/jboss/exam/modules/org/hormetq/main/lib/
    • $cp -Rap jboss-eap-6.0/modules/org/jboss/as/web/main/lib/ /usr/local/jboss/exam/modules/org/jboss/as/web/main/
  • Agora as libs já foram copiadas, mas é preciso dizer ao JBoss para reconhecer estas libs, isto é feito no arquivo modules.xml do módulo em questão
    • $cd /usr/local/jboss/exam/modules/org/hormetq/main/
    • $vim modules.xml
      • Adicionar <resource-root path="lib/linux-x86_64">
    • $cd /usr/local/jboss/exam/modules/org/jboss/as/web/main/
    • $vim modules.xml
      • Adicionar <resource-root path="lib/linux-x86_64">
  • É preciso dizer agora ao subsystem web para utilizar as native libs. No modo standalone, edite o standalone.xml
    • $cd /usr/local/jboss/exam/standalone/configuration
    • $vim standalone.xml
      • No subsystem web altere native="false" para native="true"
      • No subsystem logging:
        • Altere em root-logger o level name="INFO" para level name="DEBUG"
        • Altere em console-handler o level name="INFO" para level name="DEBUG"
        • Essas alterações no log são para podermos confirmar que as bibliotecas nativas estão sendo utilizadas
  • Inicie o jboss e veja se as libs native aparecem:
    • $cd /
    • $./usr/local/jboss/exam/bin/standalone.sh
  • Lembre-se: Se a prova não pedir para utilizar as libs nativas, não faça esses passos. Faça somente o que a prova pedir!

4) Configurar os requisitos mínimos de segurança para acessar e gerenciar o JBoss EAP. Acessar e gerenciar o JBoss EAP usando as ferramentas fornecidas.


https://community.jboss.org/wiki/RedHatCertifiedJBossAdministrator-JBossEAP6-Parte4

  • Crie um usuário de gerenciamento
    • $cd /usr/local/jboss/exam/
    • $./bin/add-user.sh
      • Escolha a opção a (Management User)
      • Dê enter para utilizar a Realm padrão
      • Dê um nome para o usuário
      • Dê uma senha
      • Digite "yes" para aplicar a realm
      • Digite "no" pois o usuário criado não fará a ação perguntada
  • Abra o arquivo mgmt-user.properties e verifique se o usuário foi criado corretamente
    • $ vim standalone/configuration/mgmt-user.properties
  • Inicie o JBoss
  • $cd /
  • $./usr/local/jboss/exam/bin/standalone.sh
  • Em outro terminal, acesse o JBoss via CLI:
  • $cd /usr/local/jboss/exam/
  • $./bin/jboss-cli.sh -c
  • Pronto, você está conectado via CLI no JBoss. A opção "-c" é para já entrar conectado.
  • Acesse via browser: http://localhost:9990 e digite usuário e senha, dessa forma você está acessando a interface web para gerenciamento do jboss.
  • Para acessar remotamente o CLI e a interface web de gerenciamento você precisa iniciar o JBoss com o parâmetro: -Djboss.bind.address.management=0.0.0.0

quarta-feira, 13 de março de 2013

Serialização em Java

Pessoal, segue um exemplo de serilização em Java, como eu precisava passar meu objeto como string eu usei a classe HexBin da Apache, para isso adicionei a lib xmlbeans-2.3.0.jar ao meu projeto.

Segue exemplo abaixo:

import java.io.Serializable;
import java.util.Date;

public class MyObject implements Serializable {

    private static final long serialVersionUID = 1L;

    private Boolean myBoolean = true;
    private String myString = "s";
    private Date myDate = new Date();

    public String toString() {
        return "MyObject [ myBoolean=" + myBoolean + ", myString=" + myString + ", myDate=" + myDate + " ]";
    }

}

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.apache.xmlbeans.impl.util.HexBin;

public class Main {

    public static void main(String[] args) {
        // Voce tem um objeto
        MyObject objetoInicial = new MyObject();

        // serializa ele e o transforma em String
        byte[] bytesSerializados = Main.serialize(objetoInicial);
        String stringFromBytes = HexBin.bytesToString(bytesSerializados);

        // depois voce pode, a partir da String, transformar ele em bytes novamente 
        // e deserializar transformando-o no objeto inicial novamente
        byte[] bytesFromString = HexBin.stringToBytes(stringFromBytes);
        MyObject objetoDeserializado = (MyObject) Main.deserialize(bytesFromString);

        System.out.println(objetoInicial);
        System.out.println(objetoDeserializado);
    }

    /**
     * Funcao para serializar um objeto
     */
    public static byte[] serialize(Object obj) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream os = null;
        try {
            os = new ObjectOutputStream(out);
            os.writeObject(obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return out.toByteArray();
    }

    /**
     * Funcao para deserializar um objeto
     */
    public static Object deserialize(byte[] data) {
        ByteArrayInputStream in = new ByteArrayInputStream(data);
        try {
            ObjectInputStream is = new ObjectInputStream(in);
            return is.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

}

Abraço!!
Adriano Schmidt

sábado, 26 de janeiro de 2013

Could not determine type for [..] at table [..] for columns [..]

Oi, hoje tive o erro abaixo ao iniciar minha aplicação EJB no JBoss 6

13:57:23,368 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
13:57:23,380 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=test-ear-1.0.0.ear/test-ejb-1.0.0.jar#l8 state=Create: javax.persistence.PersistenceException: [PersistenceUnit: test] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900) [:3.5.5-Final]
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74) [:3.5.5-Final]
at org.jboss.jpa.builder.DefaultCEMFBuilder.build(DefaultCEMFBuilder.java:47) [:1.0.2-alpha-1]


[...]

at java.lang.Thread.run(Thread.java:662) [:1.6.0_25]
Caused by: org.hibernate.MappingException: Could not determine type for: br.com.localhost8080.test.company.Company, at table: MY_TABLE, for columns: [org.hibernate.mapping.Column(company)]
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:291) [:3.5.5-Final]
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:275) [:3.5.5-Final]
at org.hibernate.mapping.Property.isValid(Property.java:217) [:3.5.5-Final]

O Problema era que eu tinha uma coluna mapeada assim:

@JoinColumn(name = "ID_COMPANY", nullable = false)
private Company company;

Mas ela precisa do @ManyToOne

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ID_COMPANY", nullable = false)
private Company company;

Ao fazer dessa forma funcionou normalmente : )

Vaaleu!!
Adriano Schmidt

quarta-feira, 24 de outubro de 2012

NoClassDefFoundError SessionLogEntry

Olá,

Hoje tive o erro java.lang.NoClassDefFoundError: org/eclipse/persistence/logging/SessionLogEntry ao fazer deploy da minha aplicação no WebSphere 8.

Segue log completo:

[23/10/12 14:31:14:570 BRST] 00000025 AppManagement W ADMA0116W: Unable to start: myapp-ear using: WebSphere:name=ApplicationManager,process=server1,platform=proxy,node=localhost8080Node01,version=8.0.0.0,type=ApplicationManager,mbeanIdentifier=ApplicationManager,cell=localhost8080Node01Cell,spec=1.0 exception is: javax.management.MBeanException: Exception thrown in RequiredModelMBean while trying to invoke operation startApplication
at javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1112)
[...]
Caused by: com.ibm.ws.exception.RuntimeError: java.lang.RuntimeException: java.lang.NoClassDefFoundError: org/eclipse/persistence/logging/SessionLogEntry
at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:753)
[...]
at org.eclipse.persistence.internal.sessions.AbstractSession.log(AbstractSession.java:4218)

O erro era porque eu não tinha nenhuma classe com @Entity na minha aplicação.. aí dava esse NoClassDefFoundError SessionLogEntry...

Ao adicionar essa classe:

package br.com.localhost8080.myapp;

import javax.persistence.Entity;

@Entity
public class MyTest {

}

O erro parou de acontecer!

Tive um erro semelhante a esse que postei em: http://localhost8080.blogspot.com.br/2012/10/nomodulefileexception.html

Vaaaaleu!!
Adriano Schmidt

quarta-feira, 10 de outubro de 2012

NoModuleFileException

Hoje tive o erro abaixo ao fazer deploy da minha aplicação no websphere 8:

Archive is not a valid EJB JAR File because the deployment descriptor can not be found (case sensitive): META-INF/ejb-jar.xml

org.eclipse.jst.j2ee.commonarchivecore.internal.impl.ModuleRefImpl initModuleFileFromEAR Ignoring ClassCastException [ org.eclipse.jst.j2ee.commonarchivecore.internal.impl.FileImpl incompatible with org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile ]

org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DeploymentDescriptorLoadException: dd_in_ear_load_EXC_]

Caused by: org.eclipse.jst.j2ee.commonarchivecore.internal.exception.NoModuleFileException: A file does not exist for module element having uri: myproject-ejb-1.0-SNAPSHOT.jar

Isso aconteceu pois era um projeto novo que eu estava criando e o meu jar de EJBs não tinha nehum EJB, não tinha nenhuma classe com @Stateless.

Se eu criasse uma classe como a classe abaixo o problema não acontecia mais.

@Stateless
public class MeuTesteServiceBean {

}

Vaaaleu!!
Adriano Schmidt

quinta-feira, 27 de setembro de 2012

constructor Service JAX-WS 2.2

Olá, hoje ao gerar um client para web services através de um wsdl (utilizei o gerador de client ws do eclipse) tive o seguinte erro de compilação:

Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project ProjectL8-ejb: Compilation failure: Compilation failure:
[exec] [ERROR] \work\workspaces\workspace-juno\ProjectL8\ProjectL8-ejb\src\main\java\br\com\localhost8080\wstest\ws\test\TestService.java:[39,8] cannot find symbol
[exec] [ERROR] symbol : constructor Service(java.net.URL,javax.xml.namespace.QName,javax.xml.ws.WebServiceFeature[])
[exec] [ERROR] location: class javax.xml.ws.Service

Isso acontece pois o maven está usando a classe Service errada:

javax.xml.ws.Service encontrada no "JDK SE 1.6" e no "JAX-WS 2.1" não tem este construtor com três parâmetros.

javax.xml.ws.Service encontrada no "JAX-WS 2.2" é a versão correta.

Você pode alterar o build-path diretamente do seu projeto para utilizar o jaxws-api.jar ou então alterar o seu pom para usar o "JAX-WS 2.2.x", basta adicionar no seu pom o que está no link a seguir:

http://jax-ws-commons.java.net/jaxws-maven-plugin/examples/using-jaxws22-on-jdk6.html

Vaaleu!!
Adriano Schmidt

terça-feira, 19 de junho de 2012

IDENTITY_INSERT OFF

Hoje um amigo aqui da empresa me perguntou:

"Adriano, usei a query abaixo em um banco SQLSERVER e deu esse erro ali, sabe o que pode ser?"
insert into my_table (id, description, situation_type) values (14, 'aaaa', 1);
Error: Não é possível inserir um valor explícito para a coluna de identidade na tabela 'my_table' quando IDENTITY_INSERT está definido como OFF.


Para resolver bastou tirar o id da query e deixar esse trabalho para o próprio banco de dados:

insert into my_table (description, situation_type) values ('aaaa', 1);

Pronto, resolvido!

Abraços!
Adriano Schmidt