Upload de imagens e vraptor[Resolvido]

6 respostas
kripton11235

Bom dia pessoal, estou estudando a apostila fj28 da caelum, e estou tendo problemas com o upload de imagens. Meu controlador que cuida da regra de negócio para o upload está assim:

package br.com.caelum.goodbuy.controller;



import br.com.caelum.goodbuy.modelo.Produto;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.validator.Validations;
import static br.com.caelum.vraptor.view.Results.*;

@Resource
public class ImagensController {
	private Validator validator;
	@Post
	@Path("/produtos/{produto.id}/imagem")
	public void upload(Produto produto, final UploadedFile imagem) {
		validator.checking(new Validations(){{
			if (that(imagem, is(notNullValue()), "imagem", "imagem.nula")) {
				that(imagem.getContentType(), startsWith("image"), "imagem", "nao.eh.imagem");
			}
		}});
		validator.onErrorUse(logic()).redirectTo(ProdutosController.class).edita(produto.getId());
	}
}

Minhas dúvidas são as seguintes: Com o quick fix tenho o seguinte erro: O método notNullValue não é definido para o tipo new Validations{} ficou faltando algum import que eu não realizei?
O arquivo messages.properties deve ser salvo na pasta src? O conteúdo é apenas:
imagem.nula = Digite uma imagem
nao.eh.imagem = Selecione uma imagem
?

6 Respostas

Guevara

Olá!!
Vc precisa destes imports:

import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.startsWith;
import java.io.File;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.validator.Validations;
import br.com.caelum.vraptor.view.Results;

Repare nos imports “static”. Eu tb já apanhei com isso.
O seu message.properties fica em /WEB-INF/classes.
Abraço!

kripton11235

Guevara vou testar aqui, muito obrigado pela ajuda.

kripton11235

Pessoal quando tento utilizar o import static org.hamcrest.Matchers.is por exemplo; o quick fix retorna que eu deveria criar a classe Matchers. Eu tenho que adicionar algum jar para realizar esse import?

Guevara

Opa!
Cria um arquivo matchers.xml dentro da WEB-INF e coloca este conteúdo dentro:

<matchers>

    <!-- Core -->
    <factory class="org.hamcrest.core.AllOf"/>
    <factory class="org.hamcrest.core.AnyOf"/>
    <factory class="org.hamcrest.core.CombinableMatcher"/>
    <factory class="org.hamcrest.core.DescribedAs"/>
    <factory class="org.hamcrest.core.Every"/>
    <factory class="org.hamcrest.core.Is"/>
    <factory class="org.hamcrest.core.IsAnything"/>
    <factory class="org.hamcrest.core.IsCollectionContaining"/>
    <factory class="org.hamcrest.core.IsEqual"/>
    <factory class="org.hamcrest.core.IsInstanceOf"/>
    <factory class="org.hamcrest.core.IsNot"/>
    <factory class="org.hamcrest.core.IsNull"/>
    <factory class="org.hamcrest.core.IsSame"/>
    <factory class="org.hamcrest.core.StringContains"/>
    <factory class="org.hamcrest.core.StringStartsWith"/>
    <factory class="org.hamcrest.core.StringEndsWith"/>

    <!-- Collection -->
    <factory class="org.hamcrest.collection.IsArray"/>
    <factory class="org.hamcrest.collection.IsArrayContaining"/>
    <factory class="org.hamcrest.collection.IsArrayContainingInOrder"/>
    <factory class="org.hamcrest.collection.IsArrayContainingInAnyOrder"/>
  	<factory class="org.hamcrest.collection.IsArrayWithSize"/>
    <factory class="org.hamcrest.collection.IsCollectionWithSize"/>
    <factory class="org.hamcrest.collection.IsEmptyCollection"/>    	
    <factory class="org.hamcrest.collection.IsEmptyIterable"/>    
    <factory class="org.hamcrest.collection.IsIterableContainingInOrder"/>
    <factory class="org.hamcrest.collection.IsIterableContainingInAnyOrder"/>
    <factory class="org.hamcrest.collection.IsIterableWithSize"/>   	 	
    <factory class="org.hamcrest.collection.IsMapContaining"/>
    <factory class="org.hamcrest.collection.IsMapContainingKey"/>
    <factory class="org.hamcrest.collection.IsMapContainingValue"/>
    <factory class="org.hamcrest.collection.IsIn"/>
    
    <!-- Number -->
    <factory class="org.hamcrest.number.IsCloseTo"/>
    <factory class="org.hamcrest.number.OrderingComparison"/>

    <!-- Text -->
    <factory class="org.hamcrest.text.IsEqualIgnoringCase"/>
    <factory class="org.hamcrest.text.IsEqualIgnoringWhiteSpace"/>

    <!-- Object -->
    <factory class="org.hamcrest.object.HasToString"/>
    <factory class="org.hamcrest.object.IsCompatibleType"/>
    <factory class="org.hamcrest.object.IsEventFrom"/>

    <!-- Beans -->
    <factory class="org.hamcrest.beans.HasProperty"/>
    <factory class="org.hamcrest.beans.HasPropertyWithValue"/>
    <factory class="org.hamcrest.beans.SamePropertyValuesAs"/>

    <!-- XML -->
    <factory class="org.hamcrest.xml.HasXPath"/>

</matchers>

Dá um “refresh” na aplicação e vê se resolve.
Esqueci de avisar pra colocar o jar/jar’s do Hamcrest (hamcrest-all-1.3RC0.jar; hamcrest-core-1.3RC0.jar; hamcrest-generator-1.3RC0.jar; hamcrest-integration-1.3RC0.jar)
http://code.google.com/p/hamcrest/downloads/list?can=2&q=hamcrest
Talvez precise só do hamcrest-all, mas ai vc já vai saber da existência dos outros, é só baixar e colocar na sua /lib.

kripton11235

Guevara, obrigado mais uma vez, agora sim resolvi o problema. Na pasta optional do vraptor tem o jar hamcrest-all-1.3RC0.jar, coloquei na lib e funcionou.Valeu!

gabrielmskate

Vlw Guevara, eu estava parado nessa parte!
[]'s

Criado 22 de abril de 2010
Ultima resposta 7 de mai. de 2010
Respostas 6
Participantes 3