Error: Validation failed for object='compra'. Error count: 1

Pessoal, tenho um metodo que salva os itens e a compra funciona perfeitamente, posso buscar itens e salvar, retirar itens e tal, porem ao salvar algum item se eu clicar no botão para realizar uma pesquisa pelo nome do produto da um erro;

Field error in object ‘compra’ on field ‘codigo’: rejected value [addItemNaCompra]; codes [typeMismatch.compra.codigo,typeMismatch.codigo,typeMismatch.java.lang.Long,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [compra.codigo,codigo]; arguments []; default message [codigo]]; default message [Failed to convert property value of type ‘java.lang.String’ to required type ‘java.lang.Long’ for property ‘codigo’; nested exception is java.lang.NumberFormatException: For input string: “addItemNaCompra”]

   se eu selecionar o item fizer uma pesquisa funciona;

http://localhost:8080/compras/addItemForm/7?nome=

se salvar o item na compra e depois for pesquisar, NAO; http://localhost:8080/compras/addItemNaCompra?nome=CANETA+BIC+SENSIVEL

@PostMapping("/addItemNaCompra")
public ModelAndView addItem(
ProdutoFilter produtoFilter,Compra compra,Produto produto,
BindingResult result, RedirectAttributes attributes) {

		ModelAndView mv = new ModelAndView("academia/cadastro-compra");
		compra = compraRepository.getOne(codigoCompraTemp);

		quantidadeCompraTemp = produto.getQuantidadeCompraTemp();
		valorCompra = produto.getValorCompraTemp();
		
		mv.addObject(produto);
		mv.addObject(compra);
	
		Date dataAtual = new Date();
		GregorianCalendar gc = new GregorianCalendar();
		gc.setTime(dataAtual);

		compra.setDataCompra(dataAtual);
		produto = produtoRepository.findOne(codigoProdutoTemp);
		produto.setQuantidadeCompraTemp(quantidadeCompraTemp);
		produto.setValorCompraTemp(valorCompra);

    	produtoRepository.save(produto);
		 
		List<ItemCompra> listaItens = itemCompraRepository.findByCompraCodigo(codigoCompraTemp);
		int achou = -1;
		for (int posicao = 0; posicao < listaItens.size(); posicao++) {
			if (listaItens.get(posicao).getProduto().equals(produto)) {
				achou = posicao;
			}
		}
		if (achou < 0) {
			ItemCompra itemcompra = new ItemCompra();
			
        produto =  produtoRepository.findOne(codigoProdutoTemp);

                   Integer quantidade = produto.getQuantidadeCompraTemp();
                   BigDecimal valorUnit = produto.getValorCompraTemp();	
                   BigDecimal resultado = valorUnit.multiply(BigDecimal.valueOf(quantidade.longValue()));
			
			itemcompra.setValorUnitario(resultado);
			itemcompra.setQuantidade(produto.getQuantidadeCompraTemp());
			itemcompra.setProduto(produto);
			itemcompra.setCompra(compra);
			listaItens.add(itemcompra);
			produto.setQuantidadeEstoque(produto.getQuantidadeEstoque() + produto.getQuantidadeCompraTemp());
			itemCompraRepository.save(itemcompra);

			somar(compra, itemcompra);
			mv.addObject("mensagem", "Item inserido com sucesso.");
			mv.addObject(compra);
		    mv.addObject("listaItens", itemCompraRepository.findByCompraCodigo(codigoCompraTemp));
		} else {
			ItemCompra itemCompra = listaItens.get(achou);
			somar(compra, itemCompra);
			mv.addObject("mensagemErro", "O mesmo item não pode ser inserido 2 vezes.");
			mv.addObject(compra);
			mv.addObject("listaItens", itemCompraRepository.findByCompraCodigo(codigoCompraTemp));
		}
		compraRepository.save(compra);
		
		mv.addObject("listaItens", itemCompraRepository.findByCompraCodigo(codigoCompraTemp));
		attributes.addFlashAttribute("mensagem", "Compra salva com sucesso!");
		return mv;
	}

Simplesmente ao ler a assinatura do metodo ja gera a exception.