domingo, 21 de fevereiro de 2016

Convertendo objetos Java para JSON usando JSON-P

Falamos aqui na outra postagem sobre JAXB, a biblioteca padrão do Java para conversão de objetos para XML e vice versa. Hoje vamos falar sobre a conversão para JSON(um formato de dados famoso) usando JSON Processing.

JSON Explanation
Para um exemplo sobre uso de JSON com Android, veja esse artigo

API padrão do Java para JSON


O Java, por muitos anos, não tinha um padrão para a conversão de JSON, isso mudou com a JSR 353, que nos trouxe o JSON-P (JSON Processing).
Nessa especificação temos uma nova API para realizar transformação de JSON que é baseada em manipular a estrutura do JSON usando Java. Ou seja, não é uma API de binding, como mostrados para XML(onde podemos fazer a correspondência de um objeto Java para JSON ! Para isso temos a JSON-B(JSON binding), que ainda está em discussão e fará parte do Java EE 8, por enquanto podemos usar a API Jackson.

A API JSON Processing

Para utilizarmos JSON-P, temos que conhecer algumas classes importantes. Veja a tabela traduzida dessa página:

Principais classes e interfaces do pacote javax.json
Classe ou InterfaceDescrição
Json
Contém métodos especifícicos para criar instâncias de parsers JSON, builders e fábricas para criar objetos.
JsonReader
Lê JSON de um Stream e cria objetos de modelo em memória. (objetos de modelo que representam o JSON)
JsonObjectBuilder
JsonArrayBuilder
Cria um modelo de objeto ou um modelo de array na memória adicionando elementos da aplicação.
JsonWriter
Escreve um objeto da memória para um Stream.
JsonValue
Representa um elemento (como um objeto, um array ou um valor) em dados no formato JSON.
JsonStructure
Representa um objeto ou um array no formato JSON. É um subtipo do JsonValue.
JsonObject
JsonArray
Representa um objeto ou um array no tipo JSON.Essas interfaces são subtipos de JsonStructure.
JsonString
JsonNumber
Representam tipos de dados em JSON. Essas interfaces são subtipos de  JsonValue.
JsonException
Indicate que houve um error no processamento do JSON.

Principais classes e interfaces do pacto javax.json.stream
Classe ou interfaceDescrição
JsonParser
Representa um parser baseado em JSON que pode ler dados JSON de um Stream ou de um objeto de modelo.
JsonGenerator
Escreve JSON para um Stream, um elemento por vez.




Se você leu ali em cima,vamos ao código para "digerir" a informação.

Uma aplicação de exemplo


Vamos utilizar o mesmo objeto do post passado, o Artigo. Como iremos usar maven, precisamos adicionar a API e a implementação. Abaixo você pode ver o código Java e o JSON usado. O método javaParaJson gera o JSON a partir de uma lista de artigos e o mesmo JSON gerado será lido no métódo jsonParaJava devidamente comentados.


Conclusão


Apresentamos JSON-P e falamos da conversão JSON para Java e vice versa. Embora Java ainda não tenha uma forma nativa de lidar com JSON, a API JSON-P é simples de ser usada e a nova API JSON-B promete a mesma facilidade do JAXB para JSON.

O projeto maven usado nessa postagem está on github!



segunda-feira, 26 de outubro de 2015

Introdução à conversão de objetos Java para XML

Nessa postagem vamos brevemente abordar a API de conversão para XML em Java (e vice-versa): O JAXB.

JAXB


JAXB significa Java API for XML Binding, e é uma especificação do Java para trazer uma API para fazer a correspondência entre objetos Java e dados no formato XML.

Sob a JSR 222, JAXB é especificado e mantido por um grupo de especialista. Hoje, sem nos aprofundar muitos, vamos mostrar exemplos de criação de XML a partir de objetos Java.

Notem que, ao contrário de outras postagens desse blog, nossos exemplos não vão precisar de um servidor de aplicação, pois as classes do JAXB são parte do Java! Se utilizar uma versão nova do Java, você não enfrentará nenhum problema.

De POJO para documentos XML


POJO é o significado de Plain Old Java Object, objetos Java simples com atributos privados, construtores sem argumentos e métodos de acesso aos atributos.
Vamos começar imaginando que você quer ter uma representação de um objeto Java em XML sem se preocupar com a formatação do XML em sí, logo o método mais simples é usar a anotação @javax.bind.xml.XmlRootElement na declaração de sua classe. Basicamente qualquer classe Java pode ser transformada em XML depois que você adiciona essa anotação, pois o nome dos atributos, as subclasses, formatos de data, etc, tudo tem uma forma padrão que você pode modificar com outras anotações Java!
Em seguida temos que usar um código simples de entender que é o utilizado para invocar o JAXB e fazer a conversão do objeto para XML. A forma mais fácil e menos burocrática é utilizando a classe javax.xml.bind.JAXB e seus métodos estáticos. Com essa classe podemos invocar o método marshall e informar o objeto a ser transformado para XML e onde será armazenado o resultado, que pode ser um OutputStream, um arquivo e até uma StringWriter. Enfim, veja abaixo em código o que descrevemos.


Trazendo do XML para objetos Java



O caminho inverso é tão simples quanto o mostrado anteriormente. Você deve fornecer ao método unmarshall da classe JAXB uma fonte de entrada que pode ser um arquivo, um leitor de String, um InputStream ou outros. Você também deve fornecer o tipo, que é classe que contém as anotações JAXB. Essencial sempre é pelo menos a anotação @javax.bind.xml.XmlRootElement. Veja novamente em código o que estamos falando:


Aprendendo mais


O que mostramos nesse breve artigo foi o começo de um mundo novo a ser explorado. Documentos XMLs não são tão simples quanto se pensa e há diversas conversões que podemos fazer, por exemplo: podemos usar atributos nos elementos, utilizar formas diferentes de fazer listas de outros subelementos, ignorar alguns campos, utilizar alguma forma específica de conversão para objetos, entre muitas outras possibilidades.

domingo, 26 de julho de 2015

O básico sobre segurança em aplicações WEB Java usando JAAS

Como vocês já perceberam em postagens anteriores, o servlet é uma classe java que responde a requisições. O HttpServlet responde a requisições HTTP.
Servlets não tem um main, isso por que instalamos os mesmos em um servidor Java WEB(um contêiner) e ele invoca os métodos do Servlet pra gente. Mais do que isso! O conteiner controla o ciclo de vida e faz o tratamento das requisições HTTP, transformando elas em objetos Java que você pode usar em seu código.
Uma das maiores vantagens de delegarmos as coisas para o contêiner é programar menos e deixar ele fazer as coisas para a gente. Por exemplo, injeção de dependência, controle de transação e segurança podem ser delegadas para o contêiner sendo que você pode focar no seu código Java. Outro ponto é a flexibilidade da sua aplicação, podemos configurar as coisas no contêiner invés de termos que modificar o código da app.
Nesse artigo vamos mostrar como delegar a tarefa de login para o Wildfly em poucos passos, não iremos mostrar a fundo diversas coisas, mas futuramente voltaremos a esse tópico.

Nosso "alvo"


Lembra do "Olá Mundo com Servlet"? Criamos uma versão com segurança onde um acesso ao servlet irá requerer autenticação. Vamos ser bem diretos no assunto, então é interessante que você tenha o Ola Servlet na sua máquina e todas as configurações feitas para executar o mesmo. Se tiver dúvidas, volte à postagem anterior.

Na nossa aplicação a execução do Olá Mundo só será possível se o usuário fornecer credenciais corretas.

Adicionando segurança à aplicação


1) Use web.xml para declarar a segurança que quer na sua aplicação. Nessa etapa falamos os contextos que irão sofrer segurança e o tipo de segurança aplicada(como autenticação BASIC);
2) Declare o security domain usado nesse aplicação usando o jboss-web.xml, um arquivo que deve ficar no diretório WEB-INF do seu WAR. Vejam abaixo o conteúdo dos arquivos web.xml e jboss-web.xml:


As modificações na nossa aplicação são só essas. Veja que a aplicação não sabe se as credenciais de segurança virão de um banco de dados, LDAP, arquivo de texto, etc. De fato, essa é a ideia: delegar a segurança para o servidor de aplicação. No nosso caso estamos usando um pronto que traz os dados de usuários e roles de arquivos gerenciados pelo Wilfly, o other. Vamos falar agora como poderíamos utilizar outras formas de autenticação no Widlfly 8.2.

3) Um outro passo seria alterar o arquivo standalone.xml do Wildfly para declarar como será feito a segurança; Esse arquivo fica em {INSTALAÇÃO WILDFLY}/standalone/configuration

A segurança pode ser feita através dos login modules. E nessa postagem usamos o security domain other, os que irão buscar as credenciais e irão checar roles em um arquivo de texto! Poderíamos utilizar outros Login Modules para acessar banco de dados, LDAP, etc, veja os login modules disponíveis.

Usando o other (que na verdade é o security domain padrão), temos que adicionar usuários com o script add-user.sh(ou bat para os usuários do outro sistema) que fica em {INSTALAÇÃO WILDFLY}/bin. Veja abaixo como é feito esse processo de adicionar usuário com esse script no ApplicationRealm (que é o que devemos usar no nosso caso):



Após fazer isso, só podemos executar o servlet passando dados de usuário que configuramos com esse script, ou não estaremos autorizados. Lembrando que o other foi usado para teste, você pode configurar um security domain que poderá auxiliar você trazendo roles e usuários de um LDAP, banco de dados, etc...

Se você tiver a nossa aplicação de olá mundo e modificar ela seguindo os passos aqui, ao acessar a mesma você terá que entrar com usuário e senha que você adicionou usando o add-user.

Conclusão


Mostramos o básico sobre segurança de aplicações WEB no Wildfly e não abordamos autorização, só autenticação. Há, obviamente, muito a ser aprendido e muitos detalhes e dúvidas que irão surgir no momento que você for criar a sua aplicação, por esse motivo voltaremos a esse tópico futuramente!