Adicionar parâmetro de contexto no bean

Pessoal,

Possuo um Bean que representa uma entidade do meu BD e um serviço que me retorna os dados dessa entidade.

Eu gostaria de ao recuperar os dados dessa entidade pudesse também incluir nesse objeto o valor de um parâmetro definido no meu deployment descriptor (web.xml).

É possível?

Vê se isso ajuda:

[code]<!–
Parametro de inicializacao que sera utilizado
por toda a sua aplicacao. Valores definidos nessa
tag podem ser recuperados em um servlet ou uma jsp
pela chamada do seguinte metodo:

String param =  
   getServletContext().getInitParameter("name");  

Onde "name" deve coincidir com o valor definido  
na subtag <param-name>.  

Vc pode definir qualquer numero de paramentros  
de inicializacao que forem necessarios.  
Inclusive zero.  
-->  
<context-param>  
    <!-- Nome do parametro de incializacao -->  
    <param-name>webmaster</param-name>  
    <!-- Valor do parametro -->  
    <param-value>myaddress@mycompany.com</param-value>  
    <description>  
        Endereco de email do adminstrador para quem questoes  
        e comentarios sobre a aplicacao devem ser enviados.  
    </description>  
</context-param>[/code]

É que na verdade eu não estou utilizando nenhuma JSP nesse caso, trata-se apenas de um serviço REST onde eu retorno dados de determinados beans a um cliente.

os dados que estão em banco de dados, referentes a cada bean estápegando certinho, o problema, ou melhor, minha dúvida é adicionar esses parâmetros do contexto.

Na verdade eu pensei dessa forma porque achei que fosse a mais fácil, já que se trata de dados que serão comuns para todos os beans não achei necessário guardá-los em banco, e sim em um arquivo que se mudar, e raramente vai, eu altero apenas no arquivo.

Se alguém tiver outra forma de eu fazer isso, será bem vinda, eu coloquei no context-param por achar que seria a melhor maneira.

Obrigado.

Faça o que o fbl.lucas falou , passando como parâmetro um HttpServletRequest para o seu serviço. A partir dele, acredito que você consegue recuperar os dados do web.xml.

certo, e como eu passo para meu serviço esse parâmetro? :oops:



@GET
public List<Objeto> recuperaObjetos(@Context HttpServletRequest request) {
    //Faz coisas... 
}

thank’s

Tenho isso:

    @GET
    @Produces({"application/json"})
    public List<Product> findAll(@Context HttpServletRequest request) {
        String initParameter = request.getServletContext().getInitParameter("settings");
        return super.findAll();
    }

Como eu poderia adicionar a essa lista a String correspondente initParameter?

:thumbup:

[quote=jmountain]Tenho isso:

    @GET
    @Produces({"application/json"})
    public List<Product> findAll(@Context HttpServletRequest request) {
        String initParameter = request.getServletContext().getInitParameter("settings");
        return super.findAll();
    }

Como eu poderia adicionar a essa lista a String correspondente initParameter?

:thumbup: [/quote]
Acredito que o método findAll deveria retornar um Objeto que contém um atributo initParameter e um atributo List

    @GET
    @Produces({"application/json"})
    public RetornoDTO findAll(@Context HttpServletRequest request) {
        String initParameter = request.getServletContext().getInitParameter("settings");
        return new RetornoDTO(initParameter, super.findAll());
    }

O problema é que como você sobrescreveu o método fica complicado você alterar o retorno…Teria que criar um método novo.
Outra solução seria criar um método que retorne apenas este valor.

[quote=fbl.lucas][quote=jmountain]Tenho isso:

    @GET
    @Produces({"application/json"})
    public List<Product> findAll(@Context HttpServletRequest request) {
        String initParameter = request.getServletContext().getInitParameter("settings");
        return super.findAll();
    }

Como eu poderia adicionar a essa lista a String correspondente initParameter?

:thumbup: [/quote]
Acredito que o método findAll deveria retornar um Objeto que contém um atributo initParameter e um atributo List

    @GET
    @Produces({"application/json"})
    public RetornoDTO findAll(@Context HttpServletRequest request) {
        String initParameter = request.getServletContext().getInitParameter("settings");
        return new RetornoDTO(initParameter, super.findAll());
    }

O problema é que como você sobrescreveu o método fica complicado você alterar o retorno…Teria que criar um método novo.
Outra solução seria criar um método que retorne apenas este valor.[/quote]

DTO não, peloamordedeus!

Tô meio sem saber como proceder por não conhecer exatamente todos os recursos da linguagem, mas aos poucos tenho conseguido me virar, mas ese probleminha aqui tá me dando uma surra pq se eu coloco settings no meu bean ele tenta realizar a busca considerando esse atributo, por isso eu acho q o correto é pegar no meu serviço, como já fiz, porém queria dar um jeito de incluir ele na minha List que possui os dados do meu bean. Alguém poderia esboçar uma idéia baseado no meu trecho?

    @GET
    @Produces({"application/json"})
    public List<Product> findAll(@Context HttpServletRequest request) {
        String settings = request.getServletContext().getInitParameter("settings");//ainda não está sendo utilizado, apenas estou pegando esse valor, é ele que quero adicionar na minha resposta
        return super.findAll();
    }

obrigado.

[quote=asaudate]
DTO não, peloamordedeus![/quote]

Qual é o problema em usar DTO? Como ele sobrescreve o método findAll realmente não seria recomendado, mas não vejo outra questão que impeça de ser utilizado ja que ele quer retornar a lista e o parametro na mesma consulta

Como o DTO funciona, tem algum link com algum exemplo? Lógico que vou pesquisar também, mas se alguém tiver algo, posta aí!

Valeu!

[quote=fbl.lucas][quote=asaudate]
DTO não, peloamordedeus![/quote]

Qual é o problema em usar DTO? Como ele sobrescreve o método findAll realmente não seria recomendado, mas não vejo outra questão que impeça de ser utilizado ja que ele quer retornar a lista e o parametro na mesma consulta[/quote]

DTO é um antipattern porque:

  1. Promove o modelo anêmico
  2. Torna a manutenção mais difícil (no caso de uma adição ou remoção de campos, por exemplo)
  3. É desnecessário no mundo de web services (anote a entidade com @XmlTransient ou não e seja feliz :wink: )

Se é mesmo necessário retornar o parâmetro de maneira separada do resto do modelo, o mais elegante de se fazer, em REST, seria retornar um Header contendo o valor. Para isso, basta alterar o resultado do serviço REST para conter uma Response - onde dá pra ajustar a entidade como a coleção e também colocar o header extra.

Ah, já ia esquecendo… dê uma olhada nesta entrevista para saber mais sobre o DTO e o famigerado BOLOVO, também - e, óbvio, saber porque é importantíssimo evitar esses (anti)patterns.

[quote=asaudate][quote=fbl.lucas][quote=asaudate]
DTO não, peloamordedeus![/quote]

Qual é o problema em usar DTO? Como ele sobrescreve o método findAll realmente não seria recomendado, mas não vejo outra questão que impeça de ser utilizado ja que ele quer retornar a lista e o parametro na mesma consulta[/quote]

DTO é um antipattern porque:

  1. Promove o modelo anêmico
  2. Torna a manutenção mais difícil (no caso de uma adição ou remoção de campos, por exemplo)
  3. É desnecessário no mundo de web services (anote a entidade com @XmlTransient ou não e seja feliz :wink: )

Se é mesmo necessário retornar o parâmetro de maneira separada do resto do modelo, o mais elegante de se fazer, em REST, seria retornar um Header contendo o valor. Para isso, basta alterar o resultado do serviço REST para conter uma Response - onde dá pra ajustar a entidade como a coleção e também colocar o header extra.

Ah, já ia esquecendo… dê uma olhada nesta entrevista para saber mais sobre o DTO e o famigerado BOLOVO, também - e, óbvio, saber porque é importantíssimo evitar esses (anti)patterns.[/quote]

Obrigado por ter separado um tempo para responder, é interessante que se promova o conhecimento através de argumentos como o seu.