O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Expression Language 3.0

207 visualizações

Publicada em

Novidades do expression language 3.0 e apresentação de uma biblioteca de conversão de beans usando a especificação.

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Expression Language 3.0

  1. 1. Expression Language 3.0 Trilha - JavaEE
  2. 2. Everton Emilio Tavares Developer
  3. 3. Expression Language 3.0 • Permite processar expressões em tempo de execução; • Histórico • Primeiramente incluído no JSTL 1; • Movido para o JSP 2; • JSF 1.0 criou uma variante para atender suas necessidades; • Unificado com o JSF 1.2 no JSP 2.1; • Especificação independente – JSR 341; • Usado no JSF, JSP, CDI, Bean Validation, entre outros...
  4. 4. Implementações <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> <version>8.0.32</version> </dependency> ... <dependency> <groupId>org.jboss.spec.javax.el</groupId> <artifactId>jboss-el-api_3.0_spec</artifactId> <version>1.0.6.Final</version> </dependency> ... <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.0</version> </dependency>
  5. 5. Novidades • Construtores de Collections; • Novos operadores (+=, = e ;) • Expressões Lambda; • Operações em Collections; • Standalone API;
  6. 6. Collections • List: • [“Renault”, “Ford”, “Ford”, “Fiat”] • Set: • {“Renault”, “Ford”, ‘Fiat’} • Map: • {“marca” : “Ford”, “modelo” : “Fiesta”}
  7. 7. Novos Operadores • Concatenação ( +=) • “Olá “ += pessoa.nome • Atribuição (=) • nome_completo = pessoa.nome += “ “ += pessoa.sobrenome; • Fim de expressão (;) • nome = pessoa.nome; “Olá “+= nome
  8. 8. Lambda • Pode ser usadas diretamente… • ((x, y) -> x + y)(2, 4) // 6 • Ou atribuir a variáveis • soma = (x,y) -> x + y; soma(5,10); // 15 • fact = n -> n == 0 ? 1 : n*fact(n-1); fact(5) // 120
  9. 9. Streams • Mesma sintaxe do Java 8 • nomes = pessoas.stream() .map(p -> p.name) .sorted() .toList() • maiores_de_idade = pessoas.stream() .filter(p -> p.age > 18) .toArray() • pais = criancas.stream() .map(c -> c.pai) .distinct() .toList()
  10. 10. Standalone API Object result; ELProcessor processor = new ELProcessor(); processor.setValue("nome", "Everton"); result = processor.eval("'Olá ' += nome"); // "Olá Everton" result = processor.eval("1"); // 1 result = processor.getValue("1", String.class); // "1"
  11. 11. Bean Converter https://github.com/ezidio/bean-converter
  12. 12. Spring Social - Tweeter • Total de 22 propriedades;
  13. 13. Mapeamento @ConvertFrom(Tweet.class) public class SimpleTweet { @PropertyMapping("origin.id") private String code; @PropertyMapping("origin.user.name += ' (@' += origin.user.screenName += ')'") private String user; @PropertyMapping("origin.text") private String text; @PropertyMapping("origin.entities.urls.stream().findFirst().orElse(null).url") private String url; @PropertyMapping("origin.entities.hashTags.stream().map(h -> h.text).toList()") private List<String> tags; //... }
  14. 14. Bean Converter @Test public void should_convert_tweet() throws Exception { Tweet tweet = TestUtils.loadObject("/tweet.json", Tweet.class); SimpleTweet result = new BeanConverter().convert(tweet, SimpleTweet.class); assertEquals(tweet.getText(), result.getText()); assertEquals(Lists.newArrayList("Ruby", "TheDevConf"), result.getTags()); assertEquals("https://t.co/L2PKu17aD6", result.getUrl()); assertEquals("TDC2016 (@TheDevConf)", result.getUser()); }
  15. 15. Configurando o ELProcessor SearchResults searchResult = twitter.searchOperations().search("#TheDevConf"); ELProcessor proc = new ELProcessor(); // Configuração do ELProcessor List<SimpleTweet> result = new BeanConverter(proc).convertList( searchResult.getTweets(), SimpleTweet.class);
  16. 16. Type Converter ELProcessor processor = new ELProcessor(); processor.getELManager().addELResolver(new URLConverter()); ... @PropertyMapping("origin.user.url") private URL userURL;
  17. 17. Type Converter public class URLConverter extends TypeConverter { @Override public Object convertToType(ELContext elContext, Object o, Class<?> aClass) { try { if (URL.class.equals(aClass) && String.class.isInstance(o)) { elContext.setPropertyResolved(true); return new URL(String.class.cast(o)); } } catch (MalformedURLException e) { throw new IllegalArgumentException("URL inválida: “+o, e); } return null; } }
  18. 18. Importar Classes ELProcessor processor = new ELProcessor(); processor.getELManager().importClass("com.google.common.base.MoreObjects"); ... @PropertyMapping("MoreObjects.firstNonNull(origin.retweetedStatus, 'UNDEFINED')") private String retweetedStatus;
  19. 19. Importar Package ELProcessor processor = new ELProcessor(); processor.getELManager().importPackage("com.google.common.base"); ... @PropertyMapping("Ascii.truncate(origin.text, 50, '...')") private String text; @PropertyMapping("MoreObjects.firstNonNull(origin.retweetedStatus, 'UNDEFINED')") private String retweetedStatus;
  20. 20. Definição de funções ELProcessor p= new ELProcessor(); p.defineFunction(“guava", “trunc", Ascii.class.getName(), “truncate"); p.defineFunction(“guava", “nvl", MoreObjects.class.getName(), “firstNonNull"); ... @PropertyMapping(“guava:trunc(origin.text, 50, '...')") private String text; @PropertyMapping(“guava:nvl(origin.retweetedStatus, 'UNDEFINED')") private String retweetedStatus;
  21. 21. BeanNameResolver @ConvertFrom(TwitterProfile.class) public class MyUserProfile { @PropertyMapping("origin.name") private String name; @PropertyMapping("twitterService.getLastTweets(origin.screenName)") private List<Tweet> lastTweets; //... }
  22. 22. BeanNameResolver @Component public class SpringBeanNameResolver extends BeanNameResolver { @Autowired private ApplicationContext applicationContext; @Override public boolean isNameResolved(String beanName) { return applicationContext.getBean(beanName) != null; } @Override public Object getBean(String beanName) { return applicationContext.getBean(beanName); } }
  23. 23. BeanNameResolver @Autowired SpringBeanNameResolver springBeanNameResolver; // ... ELProcessor processor = new ELProcessor(); processor.getELManager().addBeanNameResolver(springBeanNameResolver);
  24. 24. Obrigado! @ezidiu everton.tavares.dev@gmail.com

×