Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problema ao serializar lista de objetos (com o spring como provider) #446

Open
brunomaomeh opened this issue Jul 11, 2012 · 0 comments
Open

Comments

@brunomaomeh
Copy link

Estou usando o spring como container de injeção de dependências. Em um dos métodos do controler, preciso receber uma lista de RespostasSelecionadas. Porém, o VRaptor está se perdendo na hora de popular essa lista, adicionando apenas um elemento nela do tipo org.springframework.security.web.util.AnyRequestMatcher

código do controller:

    @Post 
    @Path("/notificacao/respostas/salvar") 
    public void cadastrarRespostas(List<RespostaSelecionada> respostas) { 
     // processa as respostas 
    } 

código simplificado do jsp:

    <form action='<c:url value="/notificacao/respostas/salvar"/>' method="post"> 
                <div class="itForm"> 
                    <label>Número da Notificação</label> 
                    <input type="text" class="it400" name="respostas[0].valor" /> 
                </div> 
                 <div class="itForm"> 
                       <label>Data da Notificação</label> 
                       <input type="text" class="it400" name="respostas[1].valor" /> 
                 </div> 
                 <div class="itForm"> 
                        <label>Número da Notificação</label> 
                        <input type="text" class="it400" name="respostas[2].valor" /> 
                  </div> 
                  <div class="btSubmit"> 
                        <input type="submit" class="btn" value="SALVAR" /> 
                   </div> 
    </form> 

A lista que ele retorna só tem elementos do spring security.

o bug é por causa desse método.

mais especificamente:

} else if (param.clazz.isInterface() && container.canProvide(param.clazz)) { 

            return container.instanceFor(param.clazz); 
} 

List.class é uma interface, e o Spring está respondendo que canProvide a lista... embora não seja a lista esperada. :~

Possíveis Soluções
public class CustomProvider extends SpringProvider { 
     @Override 
     public void start(ServletContext context) { 
           super.start(context); 
           ConfigurableWebApplicationContext ctx = getParentApplicationContext(context);
           ((DefaultListableBeanFactory) ctx.getBeanFactory()).removeBeanDefinition(SpringBasedContainer.class.getName());
           Container container = new Container() {
                public boolean canProvide(Class<?> type) { 
                     if (List.class.isAssignableFrom(type)) { 
                         return false; 
                     } 
                     return getContainer().canProvide(type); 
                } 
                public <T> T instanceFor(Class<T> type) { 
                     return getContainer().instanceFor(type); 
                } 
           }; 
           ctx.getBeanFactory().registerSingleton(SpringBasedContainer.class.getName() , container); 
     } 
} 

A thread na lista de discussão está aqui.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant