--- title: Environment --- # Trabalhando com diferentes ambientes Environment é uma funcionalidade do VRaptor que permite que você pode definir componentes diferentes conforme o ambiente que você está: produção, testes, desenvolvimento, etc. ## Configuração Em seu `web.xml`, adicione: ~~~ #!xml br.com.caelum.vraptor.environment nome_do_ambiente ~~~ Onde `nome_do_ambiente` é o ambiente atual (`PRODUCTION` ou `DEVELOPMENT`, por exemplo). Ou se preferir, você também pode criar uma variável global do sistema chamada `VRAPTOR_ENVIRONMENT`. ## nome_do_ambiente.properties Seu nome_do_ambiente.properties deve ser criado em `src/main/resources`. Exemplo (development.properties): ~~~ ambiente_de_teste = true email_de_teste = test.mail@mail.com environment.controller = true ~~~ ## Acessando propriedades de ambiente no seu código ~~~ #!java import br.com.caelum.vraptor.environment.Environment; @Controller public class MeuController { private final Environment environment; private final MailSender sender; @Inject public MeuController(Environment environment, MailSender sender) { this.environment = environment; this.sender = sender; } public void sendMail(String email) { if(environment.isDevelopment()) { sender.sendMailTo(environment.get("dev_mail")); return; } sender.sendMailTo(email); } } ~~~ ## Acessando propriedades de ambiente no jsp ~~~ #!xml

Você está no ambiente de teste. Suas ações aqui não afetarão o sistema.

Enviando e-mail para: ${environment.get('email_de_teste')} ~~~ ## Acessando arquivos de configuração de acordo com o environment Se você precisa acessar um arquivo de configuração diferente para suas bibliotecas, de acordo com seu ambiente, você também pode utilizar o Environemnt. Basta colocar, por exemplo, seu `hibernate.cfg.xml` em diretórios com o nome de seus ambientes: *development* e *production* (por exemplo). `Environment.getResource(...)` retornará o resource de acordo com seu ambiente atual: ~~~ #!java cfg = new AnnotationConfiguration(); cfg.configure(environment.getResource("/hibernate.cfg.xml")); ~~~ Para manter compatibilidade com quem não utilizava o environment, caso o arquivo não seja encontrado no diretório com o nome do ambiente, ele será carregado no diretório root (do classpath). ## Injetando o valor de suas configuração programaticamente Você também consegue injetar suas configurações programaticamente usando o `@Property`, por exemplo: ~~~ #!java import br.com.caelum.vraptor.environment.Environment; @Controller public class MeuController { @Inject @Property("email") private String email; public void sendMail(String email) { sender.sendMailTo(email); } } ~~~ Neste caso, se o seu environment estiver com valor `DEVELOPMENT`, vai injetar o valor que corresponde a chave *email* do arquivo `development.properties`, se estiver com `PRODUCTION` do `production.properties` e assim por diante. Dessa forma você não precisa dos ifs como: `if(environment.isDevelopment()) {...}` em seu código. Outra facilidade, é que se o nome da chave for o mesmo nome do field injetado, como em nosso caso com a chave *email*, você pode deixar apenas o `@Property` que o nome será inferido. Seu controller ficaria assim: ~~~ #!java import br.com.caelum.vraptor.environment.Environment; @Controller public class MeuController { @Inject @Property private String email; public void sendMail(String email) { sender.sendMailTo(email); } } ~~~