14 de fevereiro de 2014
[SoapUi] Removendo comentários "Optional" em Web Services

O Soapui é uma ferramente de geração de testes client criada para facilitar a vida tanto de desenvolvedores quando testers de Web Services. Através dela, o usuário tem a possibilidade de gerar projetos a partir da URL do WSDL do serviço. Através disso uma requisição de ação (request action) será gerada com os parâmetros do método requerido já carregados inicialmente.

Independente da tecnologia WS usada, o SoapUi tem o poder de reconhecer os parâmetros, em vista da universalidade do xml usada na especificação. Além disso, é possível observar também a presença do comentários que vem precedidos de cada campo. Como mostrado na figura abaixo.

Figura 1. Código exemplo de request action no SoapUi

Esse tipo de comentário existe para o caso em que o número mínimo de ocorrências para o parâmetro é zero. Se o elemento for obrigatório o SoapUi não exibe nada acima. E é ainda onde entra a questão... Como fazer?
Suponha que você tenha um WSDL semelhante ao exibido na listagem abaixo:
<xsd:element name="inserirPessoa">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="id" type="xsd:int" minOccurs="1" maxOccurs="1" />
      <xsd:element name="email" type="xsd:string" minOccurs="0" maxOccurs="1" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>


A definição dos atributos minOccurs e maxOccurs pode ser justificada da seguinte maneira:
minOccurs="0" maxOccurs="1" -> significa opcional;
minOccurs="1" maxOccurs="1" -> significa obrigatório.

A utilização do maxOccurs não é obrigatória, logo, você pode usar apenas o atributo "minOccurs" setado com o valor 1 e tudo vai funcionar perfeitamente também.

O resultado na geração do XML de entrada no SoapUi será algo semelhante a:
<soapenv:Body>
  <xsd:inserirPessoa>
    <xsd:id>?</xsd:id>
    <!--Optional:-->
    <xsd:email>?</xsd:email>
  </xsd:inserirPessoa>
</soapenv:Body>


O situação muda um pouco de cor quando lidamos com a geração de WS utilizando annotations java da especificação JEE atreladas aos famosos EJBs. Neste caso, a anotação @WebService permite que você mapeie um POJO simples com todos os atributos sendo automaticamente associados aos parâmetros do serviço. Por exemplo, considere a classe simples abaixo:
public class Aluno {
    private int id;
    private String nome;
    
    // get's e set's
}

Você poderá ter o mesmo efeito empregado usando uma anotação também do pacote do JaxB:
public class Aluno {
    private int id;
    @XmlElement(required = true, nillable = false)
    private String nome;
    
    // get's e set's
}

O atributo required diz que o valor é obrigatório e o atributo nillable diz que o valor não poderá ser nulo.

Conclusão

As abordagens são relativamente simples, mas compensam o uso e conhecimento por facilitar a vida de quem irá testar ou receber o Web Service. A anotação dá a impressão de que o campo é opcional quando não é.

Em algumas versões das api's de WS o exemplo com annotations pode não funcionar. Se isso acontecer então solicite a atualização das bibliotecas. Alguns erros do tipo acontecem porque a versão não contempla os respectivos fixes. :)
-->
13 de setembro de 2013
no image

Olá galera, post rápido sobre alguns problemas que venho me defrontando com o IBM e bibliotecas afins. -->

Como muitos sabem a documentação oficial da IBM para ajudar a resolver os problemas decorrentes de suas ferramentas e api's é bem escassa e vaga. Logo, pretendo fazer um acervo de problemas que eu for tendo ao longo do usar das mesmas tecnologias.

O problema acima acontece quando tentamos usar as bibliotecas de geração de relatórios CrystalReports junto com o Java EE.



Neste caso especificamente, a ausência de algumas bibliotecas pode ocasionar determinados problemas de classes não encontradas seja em tempo de compilação ou de execução...

A lib em questão é a "commons-configuration.jar", da Apache. Ela é responsável por associar as configurações do report ao java.

É isso. Adicione ela ao seu classpath e corre para o abraço!
20 de maio de 2013
Erro WebSphere: "A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property"

Essa semana tive algumas complicações com esse erro descrito no título (em inglês por ser melhor visualizado em ferramentas de busca, ou em português para a galera que usa o servidor em português: Um Driver JDBC ou um nome de classe DataSource deve ser especificado na propriedade ConnectionDriverName).

O erro, em sua essência, é bem simples... Diz que a propriedade de conexão "driver" deveria ter sido informado para a mesma configuração de conexão. Isso pode ser simples de resolver, se você estiver usando conexões com arquivos de propriedades como manda o script antigamente, a conexão bruta. Mas pode se tornar uma baita dor de cabeça se estiver usando EJBs, um servidor JEE ou até mesmo alguma ferramenta IBM (WebSphere e RSA/RAD) como foi o meu caso.

O projeto em que trabalhava consistia de alguns AS (Application Service's) que carregavam, via injeção de dependência, o objeto EntityManager (JPA 2.0) para uso em todos os casos de uso. Este mesmo entityManager seria carregado através da especificação EJB que faz uso de alias (references) no datasource previamente criado no IBM WebSphere (7.0) usado como servidor do projeto.

Pesquisando, vi que aconselhavam a mudar a forma como estava sendo feito o lookup pelo persistence.xml. Antes eu tinha:

<persistence-unit name="myUnitName" transaction-type="JTA">
  <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
  <jta-data-source>java:comp/env/ref-jdbc/myDS</jta-data-source>
  // ...

Essa representa o acesso indirect ao recurso JNDI do seu datasource. Em alguns blogs alguns aconselhavam a mudar o acesso para direct:

<jta-data-source>jdbc/myDS</jta-data-source>

Entretanto, isso somente camuflaria o problema, uma vez que acessando o recurso diretamente, teus EJBs não teriam problema em carregá-lo.

Foi então que percebi que o problema consistia na anotação dos AS nos arquivos de ejb-jar.xml e ibm-ejb-jar.xml que precisavam de mais um recurso, uma vez que eu estava  a usar 2 datasources distintos, mas havia criado o mapeamento para apenas um deles:

<!-- ejb-jar.xml | Configuração do service -->
<session>
  <ejb-name>myAppService</ejb-name>
  <ejb-class>br.as.MyAppService</ejb-class>
  <session-type>Stateless</session-type>
  <transaction-type>Container</transaction-type>
  <resource-ref>
    <description></description>
    <res-ref-name>ref-jdbc/myDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
  </resource-ref>
  <resource-ref>
    <description></description>
    <res-ref-name>ref-jdbc/myDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
  </resource-ref>
</session>

<!-- ibm-ejb-jar.xml | Configuração do service -->
<session name="UnidadeOperacionalAS">
  <resource-ref name="ref-jdbc/myDS" binding-name="jdbc/myRealJNDI">
  </resource-ref>
  <resource-ref name="ref-jdbc/myDS" binding-name="jdbc/myRealJNDI">
  </resource-ref>
</session>

Notem que antes só havia um mapeamento e o erro em questão aparecia porque os EJBs não conseguiam enxergar o outro DS criado. A partir dessa adição de referências tudo funcionou normalmente.

Lembrando que esse foi um caso à parte, pode ser que não funcione para o seu caso, que seja outra problema de fato. No mais, espero ter ajudado! :)
16 de maio de 2013
24 de abril de 2013
Curso de Android: Criando uma loja virtual [Online]

Olá pessoal, mais um curso na Devmedia, dessa vez de Android.

Há algum tempo venho sendo cobrado e vinha me cobrando pessoalmente também por algum conteúdo mais direcionado sobre android na web. Algum curso prático que expusesse a realidade de desenvolver mobile usando a plataforma da Google.

Então, aproveitei os recursos que tenho acesso da Devmedia e lancei um novo curso online. Confiram: http://www.devmedia.com.br/curso/curso-de-android-criando-uma-loja-virtual/384

:)
21 de março de 2013
JUDCon2013:Brazil - Vou Palestrar!

Olá galera,

Depois de um tempo sem postar, é com grande satisfação que gostaria de compartilhar essa novo desafio que irei encarar: O JUDCon, uma conferência anual para usuários JBoss e desenvolvedores, organizada pela  RedHat, criadora das mesmas tecnologias.


O evento acontecerá nos dias 19 e 20 de abril em São Paulo, no SENAC Campus Santo Amaro.

O tema da palestra será: "Envers + Seam + Jboss: Why to Use?", onde explanarei sobre as tecnologias Hibernate Envers + JBoss Seam + JBoss Server de forma a ter aplicações web mais poderosas.

Neste link você poderá conferir a agenda oficial do evento!

=)