[Vraptor] Tenho 3 converters ele so passa por 1

8 respostas
Diabo_Loiro

Ola estou tendo problemas com conversores, tenho 3 converters e apenas um deles funciona,segue as classes simplificadas abaixo.

User.java

public class User {
private District district;
private List<Skill> skills=new ArrayList<Skill>();
}

Skill.ajva

public class Skill{
	private Long id;

	private SkillType skillType;
	
	private Double experienceTime;

}

SkillType.java

public class SkillType{
		
    private Long id;

    private String name;

}

District.java

public class District {
        private Long id;
	
	private String name;
}

tenho esses 3 converters

package br.com.codnamemusic.converters;

import java.text.MessageFormat;
import java.util.ResourceBundle;

import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.converter.ConversionError;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.codnamemusic.domain.Skill;

@Convert(Skill.class)
@RequestScoped
public class SkillConverter implements Converter<Skill>{
	


	

		@Override
		public Skill convert(String value, Class<? extends Skill> type,
				ResourceBundle bundle) {
			if (value == null || value.equals("")) {
				System.out.println("Skill converter null");
	            return null;
	        }
	        try {
	        	System.out.println("convert skill");
	        	Long id=Long.parseLong(value);	        	
	            return new Skill(id);
	        } catch (Exception e) {
	                    throw new ConversionError(MessageFormat.format("Erro ao converter Distrito", value));
	        }
		}



}
package br.com.codnamemusic.converters;

import java.text.MessageFormat;
import java.util.ResourceBundle;

import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.converter.ConversionError;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.codnamemusic.domain.SkillType;
import br.com.codnamemusic.persistence.SkillTypeDao;

@Convert(SkillType.class)
@RequestScoped
public class SkillTypeConverter implements Converter<SkillType>{
	
	private SkillTypeDao skillTypeDao;


	public SkillTypeConverter(SkillTypeDao skillTypeDao) {
	this.skillTypeDao=skillTypeDao;
	}
	

		@Override
		public SkillType convert(String value, Class<? extends SkillType> type,
				ResourceBundle bundle) {
			if (value == null || value.equals("")) {
				System.out.println("Skill converter null");
	            return null;
	        }
	        try {
	           	System.out.println("convert SkillType");
	        	Long id=Long.parseLong(value);	        	
	            return skillTypeDao.findById(id);
	        } catch (Exception e) {
	                    throw new ConversionError(MessageFormat.format("Erro ao converter SkillType", value));
	        }
		}



}
package br.com.codnamemusic.converters;

import java.text.MessageFormat;
import java.util.ResourceBundle;

import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.converter.ConversionError;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.codnamemusic.domain.District;
import br.com.codnamemusic.persistence.DistrictDao;

@Convert(District.class)
@RequestScoped
public class DistrictConverter implements Converter<District>{
	
	private DistrictDao districtDao;


	public DistrictConverter(DistrictDao districtDao) {
	this.districtDao=districtDao;
	}
	

		@Override
		public District convert(String value, Class<? extends District> type,
				ResourceBundle bundle) {
			if (value == null || value.equals("")) {
				System.out.println("district converter nulo");
	            return null;
	        }
	        try {
	        	System.out.println("district");
	        	Long id=Long.parseLong(value);
	            return districtDao.findById(id);
	        } catch (Exception e) {
	                    throw new ConversionError(MessageFormat.format("Erro ao converter Distrito", value));
	        }
		}



}

Estou invocando da seguinte forma

<label for="district">Selecione o bairro: </label>
    <select id="district" name="user.district" disabled="disabled">
    </select>
    
    <label for="skills">Selecione uma habilidade: </label>    
    <select id="skills" name="user.skills[0].skillType.id">    
    #foreach($item in $skills)
    <option value="$item.id">$item.name</option>
    #end    
    </select>  

    
     <label for="user.skills[0].skillLevel">
     Como voce se avalia nessa habilidade?<br>
     <input type="radio" name="user.skills[0].skillLevel" value="BEGINNER"> <span>Iniciante</span>  &nbsp; <input type="radio" name="user.skills[0].skillLevel" value="BASIC"> <span>Basico</span>&nbsp; <input type="radio" name="user.skills[0].skillLevel" value="ADVANCED"> <span>Avançado</span>&nbsp; <input type="radio" name="user.skills[0].skillLevel" value="PROFESSIONAL"> <span>Profissional</span>
     </label>

No final ele cria um objeto user porém so passa pelo DistrictConverter…ele nao passa pelo SkillTypeConverter e nen pelo SkillConverter e cria objetos java normais, não entendi isso por que criei os 3 converters da mesma forma por que apenas 1 deles funciona?

se alguém puder ajudar agradeço.

8 Respostas

Lucas_Cavalcanti

pra passar pelo converter, o nome do input/select tem quer terminar no objeto…

no seu caso vc tem um select com name user.skills[0].skillType.id, ou seja, ele popula o id do skillType… se quiser que passe pelo converter o nome precisa ser: user.skills[0].skillType

Diabo_Loiro

vou testar, porém neste caso meu converter para objeto skill nunca vai ser ativado mesmo… apenas se ele for o ultimo objeto correto?

obrigado lucas.

Lucas_Cavalcanti

ele vai ser ativado se tiver algum outro input/select que tenha ele como último objeto.

mesmo que tenham outros inputs setando as propriedades dele… o converter roda antes das outras propriedades

Diabo_Loiro

vlw lucas, uma ultima duvida so por curiosidade eu tivesse algo como

public class User {  
private District district;  
}
public class District {  
        private Long id;  
      
    private String name;

private User user;  
}

seria possivel eu setar o User que sera criado dentro do district tipo um relacionamento bidirencional?

Lucas_Cavalcanti

se for um usuário novo, vc só consegue fazer isso no controller…

em geral vc só precisa setar o lado sem o mapped by pro relacionamento ir pro banco… ou vc pode setar o outro lado em um dos setters.

Diabo_Loiro

obrigado lucas ajudou mto. acho inclusive que essa informação que o objeto deve ser o ultimo devia estar na documentacao, pois não achei nada sobre isso por la, ou não tem ou esta mto discreto…

Lucas_Cavalcanti

verdade… abre uma issue lá por favor:

ou, quem sabe, um pull request =)

Diabo_Loiro

Vou tentar fazer um pull request.

Criado 28 de novembro de 2012
Ultima resposta 29 de nov. de 2012
Respostas 8
Participantes 2