Vraptor Bind [RESOLVIDO]

Pessoal, estou ecrevendo por que já não sei mais o que fazer, vejam que bizarro:

tenho um controller que está funcionando normalmente, super simples por sinal, criei um outro para fazer o signup utilizando alguns methodos do SpringSecurity e Social, porém quando dou post para esse novo controller o bind do objeto vs campos não funciona.

Não consegui encontrar o problema de jeito nenhum, sendo assim transferi este método para o controller que estava funcionando e nada, se eu mudar o Objeto de parametro deste controller que está funcionando o bind não rola também.

Criei uma classe POJO identica e mesmo assim o controller que estava funcionando para de funcionar, vamos ao código:

Controller Funcional:

	@Post
	@Path("/add")
	@Consumes(value={"application/json", "application/x-www-form-urlencoded"})
	public void add(final Temperature temperature) {

POJO Funcional

public class Temperature {
	
	private String tagId;
	private Long updated;
	private Double level;

Request:
http://localhost:8080/mypetslife/temperature/add
body:
temperature.tagId=849e8ab0-5438-11e1-b86c-0800200c9a66&temperature.level=38.0&temperature.updated=1353442870893

Controller alterado, não faz mais o bind:

	@Post
	@Path("/test")
	@Consumes(value={"application/json", "application/x-www-form-urlencoded"})
	public void test(final Tempero teste) {

POJO copiado e nome alterado, não faz o bind:

public class Tempero {
	
	private String tagId;
	private Long updated;
	private Double level;

Request:
http://localhost:8080/mypetslife/temperature/test
body:
tempero.tagId=849e8ab0-5438-11e1-b86c-0800200c9a66&tempero.level=38.0&tempero.updated=1353442870893

ambos request estão com os header setados normalmente:
Content-type: application/x-www-form-urlencoded
Accept: application/json

Já fiz clean no eclipse, já removi o módulo do tomcat, já até apaguei o servidor e criei outro e nada.

Valeu por qualquer ajuda.

pro consumes de application/x-www-form-urlencoded funcionar, precisaria ter esse deserializer:

que se não me engano não está deployado ainda…

crie essa classe no seu projeto e veja se funciona.

Não funcionou não, devo registrar essa classe em algum lugar ?

Lucas mas o mais estranho eh que tenho outras 4 classes de controller e todas funcionam normalmente, e todas estão do mesmo jeito.

o @Deserializes deveria já registrar… tem como debugar e ver se tá passando pelo FormDeserializer?

se vc tira o @Consumes e faz a mesma requisição funciona?

Lucas,

Não está passando pelo FormDeserializer e quando eu retiro o consumes da na mesma, não funciona.

Será que isso pode estar relacionado com algo do Spring Security? Acho que não já que não criei nenhum filtro especial para isso.

ele entra no método do controller?

Entra mas com o Objeto vazio.

bem estranho…

faz o seguinte, receba um HttpServletRequest nesse método, e no debug veja os dados que vem pra ele…

teste isso sem o @Consumes

faça o clean no projeto e no servidor.

No parameterMap está tudo vazio.

postData tambem vazio.

Cara o mais estranho é que no controller que está funcionando ele passa pelo FormDeserializer e traz o objeto normalmente e tambem funciona sem o consumes.

Cara consegui um avanço, está chegando no parameterMap, mas não no objeto.

os nomes dos parametros estão vindo corretamente na convenção do VRAptor?

Lucas, estão sim, mas no parameterMap do HttpServletRequest e não no meu objeto.

só recaptulando:

  • sem @Consumes
  • parametros no parameterMap com nomeDoObjeto.atributo=valor
  • parametro do método com Objeto nomeDoObjeto.
  • Objeto com todos os getters e setters dos atributos

isso funciona?

Vou Postar o código completo aqui.

	@Post
	@Path("/signup")
	public void signup(final Signup form, final HttpServletRequest request) {
		
		boolean result = signupHelper.signup(form, new SignupCallback() {
			public void postSignup(Account account) {
				ProviderSignInUtils.handlePostSignUp(account.getAccountId().toString(), null);
			}
		});

		if(result){	
		}
	}
public class Signup implements Serializable{

	private static final long serialVersionUID = 646243711803677367L;

	private String firstName;
	private String lastName;
	private String email;
	private String confirmEmail;
	private Gender gender;
	private Integer month;
	private Integer day;
	private Integer year;
	private String password;
	
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getConfirmEmail() {
		return confirmEmail;
	}
	public void setConfirmEmail(String confirmEmail) {
		this.confirmEmail = confirmEmail;
	}
	public Gender getGender() {
		return gender;
	}
	public void setGender(Gender gender) {
		this.gender = gender;
	}
	public Integer getMonth() {
		return month;
	}
	public void setMonth(Integer month) {
		this.month = month;
	}
	public Integer getDay() {
		return day;
	}
	public void setDay(Integer day) {
		this.day = day;
	}
	public Integer getYear() {
		return year;
	}
	public void setYear(Integer year) {
		this.year = year;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	protected void setBirthdate(List<Integer> birthdateFields) {
		this.month = birthdateFields.get(0);
		this.day = birthdateFields.get(1);
		this.year = birthdateFields.get(2);
	}

	
	public Person createPerson() {
		return new Person(firstName, lastName, email, password, gender, new LocalDate(year, month, day));
	}
	
	public static Signup fromProviderUser(UserProfile providerUser) {
		Signup form = new Signup();
		form.setFirstName(providerUser.getFirstName());
		form.setLastName(providerUser.getLastName());
		form.setEmail(providerUser.getEmail());
		form.setConfirmEmail(providerUser.getEmail());
		return form;
	}
	
}
					<form class="form-horizontal" action="<c:url value='/signup'/>" method="post">
						<fieldset>
							
							<div class="input-prepend" title="First Name">
								<span class="add-on"><i class="icon-user"></i></span>
								<input class="input-large span10" name="signup.firstName" value="${signup.firstName}" id="signup.firstName" type="text" placeholder="Nome"/>
							</div>
							<div class="clearfix"></div>
							
							<div class="input-prepend" title="Last Name">
								<span class="add-on"><i class="icon-user"></i></span>
								<input class="input-large span10" name="signup.lastName" id="signup.lastName" type="text" placeholder="Sobre Nome"/>
							</div>							
							<div class="clearfix"></div>

							<div class="input-prepend" title="Email">
								<span class="add-on"><i class="icon-envelope"></i></span>
								<input class="input-large span10" name="signup.email" id="signup.email" type="text" placeholder="Email"/>
							</div>
							<div class="clearfix"></div>

							<div class="input-prepend" title="Confirm Email">
								<span class="add-on"><i class="icon-envelope"></i></span>
								<input class="input-large span10" name="signup.confirmEmail" id="signup.confirmEmail" type="text" placeholder="Confirme o Email"/>
							</div>
							<div class="clearfix"></div>							

							<div class="input-prepend" title="Password">
								<span class="add-on"><i class="icon-lock"></i></span>
								<input class="input-large span10" name="signup.password" id="signup.password" type="password" placeholder="Digite sua Senha"/>
							</div>
							<div class="clearfix"></div>
						  <div class="control-group">
							<label class="control-label" for="gender">Sexo</label>
							<div class="controls">
								<select id="signup.gender">
									<option value="">Masculino</option>
									<option value="">Feminino</option>	
								</select>
							  </div>
							</div>
							<div class="clearfix"></div>
							
      <div id="formLeft" class="span3">
          <div class="control-group">
            <label for="select1" class="control-label">Dia:</label>
            <div class="controls">
			  <select id="signup.day">
				<option value="">Dia</option>		
				<option value="1">1</option>
				<option value="2">2</option>
				<option value="3">3</option>
				<option value="4">4</option>
				<option value="5">5</option>
				<option value="6">6</option>
				<option value="7">7</option>
				<option value="8">8</option>
				<option value="9">9</option>
				<option value="10">10</option>
				<option value="11">11</option>
				<option value="12">12</option>
				<option value="13">13</option>
				<option value="14">14</option>
				<option value="15">15</option>
				<option value="16">16</option>
				<option value="17">17</option>
				<option value="18">18</option>
				<option value="19">19</option>
				<option value="20">20</option>
				<option value="21">21</option>
				<option value="22">22</option>
				<option value="23">23</option>
				<option value="24">24</option>
				<option value="25">25</option>
				<option value="26">26</option>
				<option value="27">27</option>
				<option value="28">28</option>
				<option value="29">29</option>
				<option value="30">30</option>
				<option value="31">31</option>
			  </select>
            </div>      
          </div>
        </div>

							  <select id="signup.month" data-rel="chosen">
								<option value="">Mês</option>
								<option value="1">January</option>
								<option value="2">February</option>
								<option value="3">March</option>
								<option value="4">April</option>
								<option value="5">May</option>
								<option value="6">June</option>
								<option value="7">July</option>
								<option value="8">August</option>
								<option value="9">September</option>
								<option value="10">October</option>
								<option value="11">November</option>
								<option value="12">December</option>
							  </select> / 
							  <select id="signup.year">
								<option value="">Year</option>
								<option value="2010" />
								<option value="2009" />
								<option value="2008" />
								<option value="2007" />
								<option value="2006" />
								<option value="2005" />
								<option value="2004" />
								<option value="2003" />
								<option value="2002" />
								<option value="2001" />
								<option value="2000" />
								<option value="1999" />
								<option value="1998" />
								<option value="1997" />
								<option value="1996" />
								<option value="1995" />
								<option value="1994" />
								<option value="1993" />
								<option value="1992" />
								<option value="1991" />
								<option value="1990" />
								<option value="1989" />
								<option value="1988" />
								<option value="1987" />
								<option value="1986" />
								<option value="1985" />
								<option value="1984" />
								<option value="1983" />
								<option value="1982" />
								<option value="1981" />
								<option value="1980" />
								<option value="1979" />
								<option value="1978" />
								<option value="1977" />
								<option value="1976" />
								<option value="1975" />
								<option value="1974" />
								<option value="1973" />
								<option value="1972" />
								<option value="1971" />
								<option value="1970" />
								<option value="1969" />
								<option value="1968" />
								<option value="1967" />
								<option value="1966" />
								<option value="1965" />
								<option value="1964" />
								<option value="1963" />
								<option value="1962" />
								<option value="1961" />
								<option value="1960" />
								<option value="1959" />
								<option value="1958" />
								<option value="1957" />
								<option value="1956" />
								<option value="1955" />
								<option value="1954" />
								<option value="1953" />
								<option value="1952" />
								<option value="1951" />
								<option value="1950" />
								<option value="1949" />
								<option value="1948" />
								<option value="1947" />
								<option value="1946" />
								<option value="1945" />
								<option value="1944" />
								<option value="1943" />
								<option value="1942" />
								<option value="1941" />
								<option value="1940" />
							  </select>							  


							<div class="button-login">	
								<button type="submit" class="btn btn-primary"><i class="icon-off icon-white"></i> Login</button>
							</div>
							<div class="clearfix"></div>
							</fieldset>
					</form>

Resultado do ParameterMap:

{signup.firstName=[Ljava.lang.String;@43372a, signup.confirmEmail=[Ljava.lang.String;@dac54e, signup.email=[Ljava.lang.String;@cfb58f, signup.password=[Ljava.lang.String;@98dd73, signup.lastName=[Ljava.lang.String;@1f2b6a9}

se o parametro do método é: (final Signup form)

o nome dos inputs deve começar com form, e não com signup… esse é o erro que está acontecendo…

ou mude o nome do parametro do método pra signup, ou altere todos inputs pra form.atributo

Cara matou, nem percebi isso cara, foi muita falta de atenção minha.

Valeu mesmo Lucas.

abs.