Vraptor 3 / upload select multiple

49 respostas
L

Estou com problemas para fazer upload, no VRaptor 3, quando tenho um ou mais <select multiple… no mesmo form. Acredito que seja relacionado ao parâmetro enctype=“multipart/form-data”.

@Path("/exemplo/upload/") @Post
public void upload(UploadedFile arquivo, String[] opcoes){
     .
     .
     .
}
<form action="<c:url value="/exemplo/upload/" />" method="post" >			
   <select multiple="multiple" name="opcoes" >
	<option value="1">opcao 1</option>
	<option value="2">opcao 2</option>
	<option value="3">opcao 3</option>	
    </select>
    <input type="file" name="arquivo" />
    <input type="submit" value="upload"/>  
</form>
exception

br.com.caelum.vraptor.InterceptionException: br.com.caelum.vraptor.http.InvalidParameterException: unable to parse expression 'opcoes'
.
.
.
root cause

ognl.OgnlException: opcoes [br.com.caelum.vraptor.VRaptorException: Unable to find converter for [Ljava.lang.String;]
.
.
.
root cause

br.com.caelum.vraptor.VRaptorException: Unable to find converter for [Ljava.lang.String;
.
.
.

obrigado.

49 Respostas

Lucas_Cavalcanti

isso é um bug do vraptor…

isso vai ser corrigido, mas por enquanto você pode criar a seguinte classe:

@Convert(String[].class)
@ApplicationScoped
public class StringArrayConverter implements Converter<String[]> {

	public String[] convert(String value, Class<? extends String[]> type,
			ResourceBundle bundle) {
		return value.split(",");
	}

}

e tudo vai funcionar direitinho…
[]'s

L

Lucas,

Fiz da forma que falou. O erro parou de ocorrer, mas o retorno esta
sendo sempre o último valor selecionado e não todos os valores
selecionados como deveria ser.

Att

Paulo_Silveira

oi bruno!

a requisicao é GET? pode mandar pra gente a URL que esta sendo gerada pelo form quando voce o submete?

abracos

L

Paulo,

Requisição: POST
URL…: http://localhost:8080/contexto_aplicacao/exemplo/upload/

Att

Paulo_Silveira

oi bruno!

vamos ver se soltamos o beta4 hoje ja com a correcao desse bug!

abracos

L

Paulo,

Obrigado. Fico no aguardo.

L

Boa tarde,

Agradeço a todos pela colaboração.
Com a versão liberada b[/b] mais o “converter” sugerido pelo lucascs o problema foi solucionado por completo.

Att.

Paulo_Silveira

Oi Bruno!

Creio que com o beta4 voce nem precise desse converter!

abracos

L

Fiz o teste com o beta4 sem o converter e não funcionou, daí testei com o converter e funcionou blz.

Obrigado.

R

Voltando a este tópico, vamos supor que eu tenha o metodo:

public void addSubGrupo(List<SubGrupoProduto> subGrupoProduto) {
			if (subGrupoProduto == null) {
				//trato o null;
			} else {
				for (SubGrupoProduto subGrupo : subGrupoProduto) {
					//facaAlgo;
				}
			}
	}

Na view tenho

<form action="$request.contextPath/produto/addsubgrupo/" method="post">
			<button type="submit">$lang-add-subGrupoProduto</button>
			<div id="subGrupos">
				<label id="lblSubgrupos" for="subGrupoProduto">$lang-subGrupoProduto</label><br/>
				<select multiple="multiple" name="subGrupoProduto" size="15" >
					#foreach( $subGrupoProduto in  $subGruposDisponiveisList )
						<option value="$!subGrupoProduto.id">$!subGrupoProduto.nome</option>
					#end
				</select>
			</div>		
		</form>
O objeto está chegando null no método. Já tentei da forma acima e assim também:
<select multiple="multiple" name="subGrupoProduto[].id" size="15" >
Em ambos os casos chega null. Quando trabalho com String[] recebo os ids populados. Qual a forma correta?
Lucas_Cavalcanti

com o vraptor padrão não dá pra fazer isso… a gente usa o ognl pra popular os parâmetros e ele não suporta isso…

vc tem duas opções: ou usar javascript pra colocar os índices antes de mandar a requisição, ou criar um interceptor que tenta ajustar esses parâmetros…

o do interceptor funcionaria assim (mais ou menos):

@Intercepts
public class FixParamsInterceptor implements Interceptor {
     public FixParamsInterceptor(MutableRequest request) {..guarda em um field }
     accepts(...) { return true;}

     intercepts(...) {
          Enumerator<String> params = request.getParameterNames();

          while(params.hasNext()) {
                String param = params.next();
                if (param.contains("[]") {
                   String[] values = request.getParameter(param);
                   for (int i = 0.....)
                       request.setParameter(param.replace("[]", "[" + i+ "]"), values[i]);
                }
          }
          stack.next(method, instance);
     }
}

e vc precisaria criar a classe:

@Component
@PrototypeScoped
public class CustomRequestExecution extends DefaultRequestExecution {
       public CustomRequestExecution(InterceptorStack stack, ...) {
          super(...);
          stack.add(FixParameterInterceptor.class);
       }
}

enfim, é algo assim

Lucas_Cavalcanti

não foi implementado no vraptor ainda… mas vc pode usar o interceptor que eu mandei no último post

G

Lucas, sei que esse na verdade não é um problema do vraptor, já que é o select-multiple que envia os dados diferente dos outros objetos. Mas há um impacto que colocar esse fix no core do vraptor? Se o problema é apenas com o OGNL será que dá para fazer um fix nas classes que integram o OGNL ao vraptor?

Nas minhas aplicações que fazem o uso de select-multiple atualmente estou fazendo isso via request.getParameter.

Lucas_Cavalcanti

implementei:

http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100514.151912-6.jar

só colocar [] no nome do select, aonde fica a collection

G

Mais rápido que a foice do ceifador sinistro, hahahha.

m0ska

Eu passei a noite toda com este problema, daí achei este snapshot aqui do vraptor e funcionou assim:

Eu dei o name do select name=“gruposId[]”

e na assinatura do método tive de fazer assim!

public void salvar(Long[] gruposId) {
...
}

eu quiser usar string, ele tava dando erro de conversão.

public void salvar(String[] gruposId) {
...
}

pra mim não é um problema, mas de repente pode ser para outras pessoas.

G

m0ska, você tentou com List?

m0ska

testei com List funfou beleza :wink:

m0ska

Eu não sei se é possível, mas pra mim o ideal seria que se o name do select fosse assim: name=“fornecedor.grupos.id” ou algo parecido, ele já preencheria os ids dos grupos do fornecedor. Acho que é a solução mais elegante neste caso.

Lucas_Cavalcanti

basta nomeá-lo:

fornecedor.grupos[].id
m0ska

Funcionou, parabéns pela implementação, possibilita um código mais elegante :wink:

Só pra constar pra galera que tiver o mesmo problema no futuro.

Eu tinha uma classe fornecedor que por sua vez possuia uma coleção de grupos.
E precisava que o vraptor preenchesse automaticamente os valores dos grupos em um multiple selectbox.

public class Fornecedor extends Domain implements Serializable {
... 
    @JoinTable(name = "grupos_fornecedores", joinColumns = {@JoinColumn(name = "fornecedor_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn(name = "grupo_id", referencedColumnName = "id")})
    @ManyToMany(fetch = FetchType.LAZY)
    private List<Grupo> grupos;
...

Na última snapshot que peguei do vraptor 3 a 3.1.2xxxxx

A view ficou assim:

...
	                        <select name="fornecedor.grupos[].id" id="gruposId" size="6" style="width: 450px;" multiple="multiple">
	                            <c:forEach var="grupo" items="${grupos}">
	                                <c:set var="selected" value="" />
	                                <c:forEach var="group" items="${fornecedor.grupos}">
	                                    <c:if test="${grupo.id == group.id}">
	                                        <c:set var="selected" value="selected='selected'"/>
	                                    </c:if>
	                                </c:forEach>
	                                <option value="${grupo.id}" ${selected}>${grupo.nome}</option>
	                            </c:forEach>
	                        </select>
...

e na assinatura do método eu só precisei passar o fornecedor como parâmetro. Não preciso mais passar um array de Strings

...
	public void save(Fornecedor fornecedor) {
...
jingle

Alguém conseguiu?

minha tentativa ta assim:

no intercept…

Enumeration<String> params = request.getParameterNames();

		while (params.hasMoreElements()) {
			String param = params.nextElement();
			if (param.contains("[]")) {
				String[] values = request.getParameterValues(param);

				for (int j = 0; j < values.length; j++) {
					request.setAttribute(param.replace("[]", "[" + j + "]"),
							values[j]);
				}
			}
		}

requestexecution

public CustomRequestExecution(InterceptorStack interceptorStack, InstantiateInterceptor instantiator) { super(interceptorStack, instantiator); interceptorStack.add(FixParamsInterceptor.class); }

e no jsp…:

<input type="checkbox" name="combo[].id" value="1" /> <input type="checkbox" name="combo[].id" value="2" />

na controller…

public void editaPerfil(Usuario usuario, List<Perfil> combo){...

Esta chegando null a lista, porém se eu troco o combo[] por combo[0] e combo[1] chega o valor… tenho que alterar mais alguma coisa pra funcionar o combo[]?

Lucas_Cavalcanti

baixe o último snapshot do vraptor, isso (a notação combo[]) já está funcionando:

http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100519.161626-7.jar

jingle

Lucas Cavalcanti:
baixe o último snapshot do vraptor, isso (a notação combo[]) já está funcionando:

http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100519.161626-7.jar

preciso por algum jar a mais?

nao ta achando NoClassDefFoundError: com/thoughtworks/paranamer/AnnotationParanamer

tenho o paranamer-1.5.jar dentro do web/lib

jingle

Resolvido atulizei o paranamer para 2.2 e foi. http://repository.codehaus.org/com/thoughtworks/paranamer/paranamer/2.2/paranamer-2.2.jar

tiagojco

Me deparei com o seguinte erro ao usar select multiple Vraptor 3 (3.1.3).

09:17:07,125 DEBUG [VRaptorRequest      ] Setting noticia.editorias[0].id with [1]
09:17:07,125 DEBUG [VRaptorRequest      ] Setting noticia.editorias[1].id with [3]
09:17:07,125 DEBUG [VRaptorRequest      ] Setting noticia.editorias[2].id with [5]
09:17:07,125 DEBUG [OgnlParametersProvider] Applying noticia.editorias[].id with [1, 3, 5]
09:17:07,125 DEBUG [OgnlParametersProvider] unable to parse expression 'noticia.editorias[].id'
ognl.ExpressionSyntaxException: Malformed OGNL expression: noticia.editorias[].id [ognl.ParseException: Encountered " "]" "] "" at line 1, column 19.
Was expecting one of:
    ":" ...
    "not" ...
    "+" ...
    "-" ...
    "~" ...
    "!" ...
    "(" ...
    "true" ...
    "false" ...
    "null" ...
    "#this" ...
    "#root" ...
    "#" ...
    "[" ...
    "{" ...
    "@" ...
    "new" ...
    <IDENT> ...
    <DYNAMIC_SUBSCRIPT> ...
    "\'" ...
    "`" ...
    "\"" ...
    <INT_LITERAL> ...
    <FLT_LITERAL> ...
    ]
	at ognl.Ognl.parseExpression(Ognl.java:112)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:104)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.simtecnologia.access.controll.impl.AccessInterceptor.intercept(AccessInterceptor.java:110)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.simtecnologia.acesso.AcessoInterceptor.intercept(AcessoInterceptor.java:39)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.simtecnologia.vraptor.util.FirstInterceptor.intercept(FirstInterceptor.java:64)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
Caused by: ognl.ParseException: Encountered " "]" "] "" at line 1, column 19.
Was expecting one of:
    ":" ...
    "not" ...
    "+" ...
    "-" ...
    "~" ...
    "!" ...
    "(" ...
    "true" ...
    "false" ...
    "null" ...
    "#this" ...
    "#root" ...
    "#" ...
    "[" ...
    "{" ...
    "@" ...
    "new" ...
    <IDENT> ...
    <DYNAMIC_SUBSCRIPT> ...
    "\'" ...
    "`" ...
    "\"" ...
    <INT_LITERAL> ...
    <FLT_LITERAL> ...
    
	at ognl.OgnlParser.generateParseException(OgnlParser.java:3172)
	at ognl.OgnlParser.jj_consume_token(OgnlParser.java:3051)
	at ognl.OgnlParser.unaryExpression(OgnlParser.java:1236)
	at ognl.OgnlParser.multiplicativeExpression(OgnlParser.java:971)
	at ognl.OgnlParser.additiveExpression(OgnlParser.java:894)
	at ognl.OgnlParser.shiftExpression(OgnlParser.java:750)
	at ognl.OgnlParser.relationalExpression(OgnlParser.java:508)
	at ognl.OgnlParser.equalityExpression(OgnlParser.java:405)
	at ognl.OgnlParser.andExpression(OgnlParser.java:352)
	at ognl.OgnlParser.exclusiveOrExpression(OgnlParser.java:299)
	at ognl.OgnlParser.inclusiveOrExpression(OgnlParser.java:246)
	at ognl.OgnlParser.logicalAndExpression(OgnlParser.java:193)
	at ognl.OgnlParser.logicalOrExpression(OgnlParser.java:140)
	at ognl.OgnlParser.conditionalTestExpression(OgnlParser.java:101)
	at ognl.OgnlParser.assignmentExpression(OgnlParser.java:64)
	at ognl.OgnlParser.expression(OgnlParser.java:23)
	at ognl.OgnlParser.index(OgnlParser.java:2336)
	at ognl.OgnlParser.navigationChain(OgnlParser.java:1331)
	at ognl.OgnlParser.unaryExpression(OgnlParser.java:1196)
	at ognl.OgnlParser.multiplicativeExpression(OgnlParser.java:971)
	at ognl.OgnlParser.additiveExpression(OgnlParser.java:894)
	at ognl.OgnlParser.shiftExpression(OgnlParser.java:750)
	at ognl.OgnlParser.relationalExpression(OgnlParser.java:508)
	at ognl.OgnlParser.equalityExpression(OgnlParser.java:405)
	at ognl.OgnlParser.andExpression(OgnlParser.java:352)
	at ognl.OgnlParser.exclusiveOrExpression(OgnlParser.java:299)
	at ognl.OgnlParser.inclusiveOrExpression(OgnlParser.java:246)
	at ognl.OgnlParser.logicalAndExpression(OgnlParser.java:193)
	at ognl.OgnlParser.logicalOrExpression(OgnlParser.java:140)
	at ognl.OgnlParser.conditionalTestExpression(OgnlParser.java:101)
	at ognl.OgnlParser.assignmentExpression(OgnlParser.java:64)
	at ognl.OgnlParser.expression(OgnlParser.java:23)
	at ognl.OgnlParser.topLevelExpression(OgnlParser.java:15)
	at ognl.Ognl.parseExpression(Ognl.java:110)
	... 50 more
/-- Encapsulated exception ------------\
ognl.ParseException: Encountered " "]" "] "" at line 1, column 19.
Was expecting one of:
    ":" ...
    "not" ...
    "+" ...
    "-" ...
    "~" ...
    "!" ...
    "(" ...
    "true" ...
    "false" ...
    "null" ...
    "#this" ...
    "#root" ...
    "#" ...
    "[" ...
    "{" ...
    "@" ...
    "new" ...
    <IDENT> ...
    <DYNAMIC_SUBSCRIPT> ...
    "\'" ...
    "`" ...
    "\"" ...
    <INT_LITERAL> ...
    <FLT_LITERAL> ...
    
	at ognl.OgnlParser.generateParseException(OgnlParser.java:3172)
	at ognl.OgnlParser.jj_consume_token(OgnlParser.java:3051)
	at ognl.OgnlParser.unaryExpression(OgnlParser.java:1236)
	at ognl.OgnlParser.multiplicativeExpression(OgnlParser.java:971)
	at ognl.OgnlParser.additiveExpression(OgnlParser.java:894)
	at ognl.OgnlParser.shiftExpression(OgnlParser.java:750)
	at ognl.OgnlParser.relationalExpression(OgnlParser.java:508)
	at ognl.OgnlParser.equalityExpression(OgnlParser.java:405)
	at ognl.OgnlParser.andExpression(OgnlParser.java:352)
	at ognl.OgnlParser.exclusiveOrExpression(OgnlParser.java:299)
	at ognl.OgnlParser.inclusiveOrExpression(OgnlParser.java:246)
	at ognl.OgnlParser.logicalAndExpression(OgnlParser.java:193)
	at ognl.OgnlParser.logicalOrExpression(OgnlParser.java:140)
	at ognl.OgnlParser.conditionalTestExpression(OgnlParser.java:101)
	at ognl.OgnlParser.assignmentExpression(OgnlParser.java:64)
	at ognl.OgnlParser.expression(OgnlParser.java:23)
	at ognl.OgnlParser.index(OgnlParser.java:2336)
	at ognl.OgnlParser.navigationChain(OgnlParser.java:1331)
	at ognl.OgnlParser.unaryExpression(OgnlParser.java:1196)
	at ognl.OgnlParser.multiplicativeExpression(OgnlParser.java:971)
	at ognl.OgnlParser.additiveExpression(OgnlParser.java:894)
	at ognl.OgnlParser.shiftExpression(OgnlParser.java:750)
	at ognl.OgnlParser.relationalExpression(OgnlParser.java:508)
	at ognl.OgnlParser.equalityExpression(OgnlParser.java:405)
	at ognl.OgnlParser.andExpression(OgnlParser.java:352)
	at ognl.OgnlParser.exclusiveOrExpression(OgnlParser.java:299)
	at ognl.OgnlParser.inclusiveOrExpression(OgnlParser.java:246)
	at ognl.OgnlParser.logicalAndExpression(OgnlParser.java:193)
	at ognl.OgnlParser.logicalOrExpression(OgnlParser.java:140)
	at ognl.OgnlParser.conditionalTestExpression(OgnlParser.java:101)
	at ognl.OgnlParser.assignmentExpression(OgnlParser.java:64)
	at ognl.OgnlParser.expression(OgnlParser.java:23)
	at ognl.OgnlParser.topLevelExpression(OgnlParser.java:15)
	at ognl.Ognl.parseExpression(Ognl.java:110)
	at ognl.Ognl.setValue(Ognl.java:783)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:90)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:104)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.simtecnologia.access.controll.impl.AccessInterceptor.intercept(AccessInterceptor.java:110)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.simtecnologia.acesso.AcessoInterceptor.intercept(AcessoInterceptor.java:39)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.simtecnologia.vraptor.util.FirstInterceptor.intercept(FirstInterceptor.java:64)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Thread.java:619)
\--------------------------------------/

Minha visao esta assim:

<select name="noticia.editorias[].id" multiple="multiple">

OGNL 2.7.3 e Paranamer 2.2.

No meu controler eu recebo da view assim:

public void persistir(Noticia noticia);

Onde noticia.editoria eh uma lista de Editoria editoria.id e um Integer.

Alguma sugestao ?

G

Se você tem um noticia.editorias[].id, espera-se que seja um array/list. Portanto seu método deve receber List ou Noticia[], e não simplesmente Noticia.

Lucas_Cavalcanti

se existe um Noticia.setEditoriais(List) tb funciona, garcia…

esse erro chega a dar 500 ou só aparece no log?

tiagojco

Na verdade eh um List dentro do Noticia (noticia.editorias[].id)

Humm… me apressei ao informar isto como erro, fiquei sabendo de Lucas (thnks Tomaz Lavieri) que é só um log-> rethrow.

O problema que estava ocorrendo era em outro lugar (ja resolvi).

Lucas_Cavalcanti

na verdade é um silenciator mesmo (log de debug -> ignore)

como em produção vc não deveria deixar log de debug ligado, acho que não tem maiores problemas deixar assim

tiagojco

sim, saquei :stuck_out_tongue: thnx…

a titulo de informacao o problema era que o bean tinha uma propriedade “editorias” que eh um Set, e eu achei q sobrescrevendo o metodo setEditorias(List ) e convertendo a lista para um set dentro dele resolveria, mas o OGNL na verdade usa o getter do editorias para enfiar o select multiple que foi passado da view no bean (noticia.getEditorias().set(X,bla)).

como o getter de editorias voltavam um Set, dava pAu

thnxz

edit: (emoticons oh the hell)

G

Oops :oops:

rds2

Pessoal bom dia como eu faço pra percorrer uma lista de arquivos que vem do input, e exibir cada arquivo em uma linha?
A principio fiz da seguinte forma

<form action="<c:url value="???"/>" enctype="multipart/form-data" method="post">
					<input type="file" name="arquivos[]" multiple="multiple"/>
					<input type="submit"/>
					
					<c:forEach var="file" items="${ }">
						<c:out value="${file}"></c:out>					
					</c:forEach>
				</form><br/>

vlw

Lucas_Cavalcanti

vc quer exibir o que de cada arquivo? o nome? link pra download?

rds2

tenho um input file que vou faz\er o dowload multiplo, ai vi que ele separa cada url de arquivo por virgula , então eu precisaria percorrer e exibir o nome ou a url de cada arquivo apos a virgula tem que usar o split?

quero exibir o caminho dos arquivos

rds2

Assim eu vou precisar selecionar os arquivos pra upload, e exibir um em cada linha

Vc chegou a ver aquele outro topico? era so a versão do commons fileupload!! :shock:

Lucas_Cavalcanti

vi sim…

vc quer exibir o caminho dos arquivos na máquina do cara?

faça isso com algum plugin javascript, tipo o jquery uploadfy.

não dá pra fazer isso do lado do servidor (JSP), o caminho do arquivo não vai pra lá, só o nome dele vai (questão de segurança). Ou seja, só dá pra fazer isso via javascript, do lado do cliente.

rds2

Entendi… então como eu faço somente pra exibir o nome do arquivo na minha tela ,? porque o upload de um arquivo beleza eu consegui, do mesmo jeito que eu fiz aquele projeto da apostila, a diferença e´que preciso selecionar mais de um para fazer upload de uma vez so!

Lucas_Cavalcanti

sem problemas, só receber uma (List arquivos) no controller e usar o .getName() deles.

rds2

" Não consegui acessar o uploadfy é bloqueado aki vou baixar depois mas por enquanto te certo cara ?

Então meu form esta assim

<form action="<c:url value="/upload"/>" enctype="multipart/form-data" method="post">
    <input type="file" name="arquivos[]" multiple="multiple"/>
    <input type="submit"/>
</form><br/>

O controller ta assim

@Post @Path("/upload")
	public void upload(List<UploadedFile> arquivos){

        for(UploadedFile uf:arquivos){
            System.err.println(">>>>>>>>>>>>>>> "+uf.getFileName());
        }

Ai o uploadfy faz a separação de cada arquivo
vc acha que se eu seguir esse topico http://www.guj.com.br/java/206525-upload-com-vraptor3–uploadify-resolvido/4 é o que eu preciso

Lucas_Cavalcanti

acho que é sim…

no uploadfy dá pra vc registrar callbacks pra qdo um upload terminar, daí vc pode pegar o nome do arquivo e mostrar em algum lugar.

rds2

Lucas desculpa cara eu sou novato, ( pra não dizer outra coisa) ja baixei o uploadfy ,

<%@ include file="/cabecalho.jsp" %>
<script type="text/javascript" src="<c:url value="/javascript/jquery.uploadify-3.1.js" />" type="text/javascript" ></script>
<script type="text/javascript" src="<c:url value="/javascript/jquery.uploadify-3.1.min.js" />" type="text/javascript" ></script>
<script type="text/javascript">
	$(function() {
		$("#arquivos").uploadify({
            "uploader"       : '${pageContext.request.contextPath}/uploadify/uploadify.swf', //onde coloco esse swf?
            'script'         : '${pageContext.request.contextPath}/upload', // aki seria a url da minha action?
            'cancelImg'      : '${pageContext.request.contextPath}/uploadify/cancel.png', // //onde coloco esse arquivo?
            'buttonText'     : 'Selecionar arquivos',
            'folder'         : '${pageContext.request.contextPath}/uploads', // o que seria essa linha
            'multi'          : true,
            'auto'           : false
		});

		 $("#envio").click(function(){
             $("#arquivos").uploadifyUpload();
         });
	});
</script>

e o form assim

<div>
	<c:if test="${not empty error}">${error}<br/><br/></c:if>

		<form action="<c:url value="/upload"/>" enctype="multipart/form-data" method="post">
			<input type="file" name="arquivos[]" multiple="multiple"/>
			<button id="envio">Enviar</button>
		</form><br/>
</div>

meu controller ta assim …

o nome da classe é IndexController

@Post @Path("/upload")
	public void upload(UploadedFile arquivos){

            System.err.println(">>>>>>>>>>>>>>> "+arquivos.getFileName());
        }
    }
Lucas_Cavalcanti

nesse caso ele vai fazer upload arquivo por arquivo, então vc pode mudar o nome do input pra “arquivo” e o nome do UploadedFile também.

melhor forma de descobrir como se mexe com ele, é olhando o site:
http://www.uploadify.com/

http://www.uploadify.com/documentation/

rds2

Lucas como eu faço para meu form enviar a lista de arquivos para meu controller, esta chegando null!!

Esse é meu form
<form action="transmitir/upload" method="post" name="form" method="POST" enctype="multipart/form-data">
	<label for="arquivos">Arquivos</label>
	     <input type="file" name="arquivos[]" multiple="multiple"/>
		<c:forEach var="arquivo" items="${arquivos }">

			<tr><td><c:out value="arquivo"></c:out></td></tr>

		 </c:forEach>
		<input type="submit"/>
</form>

Meu controller

@Resource
public class TransmitirArquivosController {

	private final Validator validator;
	private final Result result;
	private final Arquivo arquivo;

	public TransmitirArquivosController(Validator validator, Result result, Arquivo arquivo) {
		this.result = result;
		this.arquivo = arquivo;
		this.validator = validator;
	}

	@Get @Path("/arquivos")
	public void transmitirArquivos() {
	}

	@Post @Path("transmitir/upload")
	public void upload(List<UploadedFile> arquivos) throws IOException {
		System.out.println("passou aki!");
		validator.onErrorUse(Results.page()).redirectTo("/erro.jsp");
		arquivo.salva(arquivos);
		result.redirectTo("/result.jsp");
	}

}

Minha classe

@Component
public class Arquivo {

	private List<Arquivo>arquivos;

	public List<Arquivo> getArquivos() {
		return arquivos;
	}

	public void setArquivos(List<Arquivo> arquivos) {
		this.arquivos = arquivos;
	}

	private File dirArquivos;

	public Arquivo(ServletContext context) {
		//String caminhoImagens = context.getRealPath("C:/Imagens");
		dirArquivos = new File("D:/arquivos");
		dirArquivos.mkdir();
	}

	public void salva(List<UploadedFile> arquivos) throws IOException {

		for (UploadedFile arquivo : arquivos) {
			 File destino = new File(dirArquivos, arquivo.getFileName()+".txt");

			    try {
			    	 destino.createNewFile();
			    	 IOUtils.copyLarge(arquivo.getFile(), new FileOutputStream(destino));

			    } catch (FileNotFoundException e) {
			        e.printStackTrace();
			        throw new FileNotFoundException("Arquivo não encontrado!");
			    } catch (IOException e) {
			        e.printStackTrace();
			        throw new IOException("Não foi possivel enviar o arquivo!");
			    }

			    System.out.println("Passa por aki!!!");
			    arquivo.getFile().close();


			}
		}

}
Lucas_Cavalcanti

se não funcionou assim, não sei se vai funcionar… use o uploadify, que manda de um em um.

rds2

Era o jar da aplicação ja atualizei aki!! Obrigado meu amigo!! :smiley:

rds2

Lucas bom dia ,
agora fico redondo meu projeto :lol: vlw mesmo!
So tenho uma duvida no meu metodo salva:
1° no metodo salva , o metodo “copyLarge()” no é para possibilitar o envio de arquivos maiores que 2gb?
porque estaou tentando fazer upload de arquivos .zip com tamanho de “362MB” e esta me renderizando a seguinte mensagem;

" org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (20411407) exceeds the configured maximum (2097152) "

como posso mudar isso?

public void salva(List<UploadedFile> arquivos) throws IOException {

		for (UploadedFile arquivo : arquivos) {
			 File destino = new File(dirArquivos, arquivo.getFileName());

			    try {
			    	 destino.createNewFile();
			    	 IOUtils.copyLarge(arquivo.getFile(), new FileOutputStream(destino));

			    } catch (FileNotFoundException e) {
			        e.printStackTrace();
			        throw new FileNotFoundException("Arquivo não encontrado!");
			    } catch (IOException e) {
			        e.printStackTrace();
			        throw new IOException("Não foi possivel enviar o arquivo!");
			    }

			    System.out.println("Passa por aki!!!");
			    arquivo.getFile().close();


			}
		}
seufagner

Lucas

Quanto o array ou a lista contém apenas um elemento o parâmetro vem vazio. Já vi em outra thread que este era um bug do VRaptor.

Isto foi corrigido? Lembro que você sugeriu uma abordagem para tal. Isto foi implementado?

Utilizar um sufixo “_array”, “Array”, “_list” ou “List” ficaria feio. Usar “[]” iria se resumir a Arrays.

O que você sugere?

seufagner

[duplicado]

Criado 8 de setembro de 2009
Ultima resposta 13 de mai. de 2010
Respostas 49
Participantes 10