Erro 404 ao tentar passar um multiplo select - resolvido

Tenho este que é preenchida com as opções corretamente

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
	xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"
	layout:decorate="~{layout}">
<meta charset="utf-8">
<div layout:fragment="content">
	<div class="ibox-title">
		<h2>Controle de pessoas</h2>
		<ol class="breadcrumb">
			<li><a th:href="@{/dashboard}">Página inicial</a></li>
			<li><a th:href="@{/pessoa}">Pesquisar pessoas</a></li>
			<li class="active"><strong><label
					th:text="@{{tipoPagina}(tipoPagina=${tipoPagina})}"></label> tipo
					de pessoa</strong></li>
		</ol>
	</div>
	<div class="ibox-title">
		<form class="form-horizontal" th:object="${pessoaTipoPessoa}"
			method="POST" id="codigoForm">
			<input type="hidden" id="id" th:field="*{id}" readOnly="readonly" />
			<input type="hidden" id="nomeFormulario" name="pessoaTipoPessoa"
				readOnly="readonly" />
			
			<input type="hidden" 
				id="pessoa" th:field="*{pessoa.id}" readOnly="readonly" />
				
			<div style="text-align: right;">
				<button type="submit" class="btn btn-outline btn-info dim"
					data-toggle="tooltip" data-placement="bottom" title="Salvar"
					data-original-title="Salvar" id="salvar">
					<i class="fa fa-save"></i>
				</button>
				<button type="reset" class="btn btn-outline btn-default dim"
					id="limpar" th:if="${tipoPagina == 'Inserir'}">
					<i class="fa fa-eraser"></i>
				</button>
				<a th:href="@{/pessoa}" data-toggle="tooltip"
					data-placement="bottom" title="Voltar" data-original-title="Voltar">
					<button type="button" class="btn btn-outline btn-warning dim">
						<i class="fa fa-reply"></i>
					</button>
				</a>
			</div>
			<div class="ibox float-e-margins">
				<div class="ibox-title">
					<h5>Formulário</h5>
				</div>
				<div class="ibox-content">
					<div class="row">
						<div class="col-lg-12">
							<div class="form-group">
								<label for="tipoPessoa">Tipos da pessoa <span
									class="text-danger">*</span>
								</label>
								<div data-toggle="tooltip" data-placement="bottom" title=""
									data-original-title="Selecione o tipo de pessoa !">
									<select
										class="select2_demo_2 form-control select2-hidden-accessible"
										multiple="multiple" tabindex="-1" aria-hidden="true"
										th:field="*{tiposPessoasEscolhidas}">
										<option th:each="tipo : ${tiposPessoas}" th:value="${tipo.id}"
											th:text="${tipo.descricao}"></option>
									</select>
								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</form>
		<div th:include="todos/campos_obrigatorios" th:remove="tag"></div>
	</div>
</div>
</html>

Neste componente eu posso escolher mais de um valor, conforme imagem:

Ao clicar em salvar ele chama esta funcionalidade do jquery, mas sempre está dando erro 404, conforme imagem:

O que pode ser ?

Classe DTO, que recebe as informações:

import org.hibernate.validator.constraints.NotEmpty;

import br.com.netsoft.dto.NotaFiscalServicoDTO;
import br.com.netsoft.enuns.PessoaTipoPessoaEnum;

public class PessoaTipoPessoaDTO extends NotaFiscalServicoDTO {

	private static final long serialVersionUID = 2899990968494614321L;

	private PessoaDTO pessoa;
	private PessoaTipoPessoaEnum tipoPessoa;

	@NotEmpty
	private Integer[] tiposPessoasEscolhidas;

	public PessoaDTO getPessoa() {
		return pessoa;
	}

	public void setPessoa(PessoaDTO pessoa) {
		this.pessoa = pessoa;
	}

	public PessoaTipoPessoaEnum getTipoPessoa() {
		return tipoPessoa;
	}

	public void setTipoPessoa(PessoaTipoPessoaEnum tipoPessoa) {
		this.tipoPessoa = tipoPessoa;
	}

	public Integer[] getTiposPessoasEscolhidas() {
		return tiposPessoasEscolhidas;
	}

	public void setTiposPessoasEscolhidas(Integer[] tiposPessoasEscolhidas) {
		this.tiposPessoasEscolhidas = tiposPessoasEscolhidas;
	}
}

Jquery que envia o metodo salvar, que funciona em outros formulários

var request;
$("#codigoForm").submit(function(event) {
	var endereco = "/nota-fiscal-servico-web-1.0.0/";
	var mensagem = '<h1><img src="' + endereco + 'resources/img/carregando.gif" /> Aguarde um momento...</h1>';
	$.blockUI({
		message : mensagem,
	});
	var formularioAtualizacao = endereco + "atualizacaoMonetaria/alterar/";
	var formularioTomador = endereco + "tomador/alterar/";
	var pessoaEndereco = "pessoaEndereco";
	var atualizacaoMonetariaItem = "atualizacaoMonetariaItem";
	var perguntaRespostaFrequente = "perguntaRespostaFrequente";
	var formularioPerguntaFrequente = endereco + "perguntaFrequente/alterar/";
	event.preventDefault();
	if (request) {
		request.abort();
	}
	var formulario = endereco + nomeFormulario.name;
	var $form = $(this);
	var $inputs = $form.find("input, select, button, textarea, file");
	var serializedData = $form.serialize();
	$inputs.prop("disable", true);
	request = $.ajax({
		url : formulario + "Recurso/salvar",
		type : "post",
		data : serializedData
	});
	request.done(function(response, textStatus, jqXHR) {
		console.log(jqXHR);
	});
	request.fail(function(jqXHR, textStatus, errorThrown) {
		//console.error("erro" + textStatus, errorThrown);
	});
	request.always(function(jqXHR) {
		$inputs.prop("disable", false);
		$.unblockUI(); // Desbloquear UI
		if(request.status == 200){
			if(request.responseText.indexOf("salvo") == -1){
				toastr.error(request.responseText, "Error ...");
			} else {
				toastr.info(jqXHR, "Sucesso ....");
				$('#codigoForm').trigger("reset");
				setTimeout(function() {
					tipoProcesso = formulario.indexOf(atualizacaoMonetariaItem)
					if (tipoProcesso > -1) {
						formulario = formularioAtualizacao + $inputs[2].value;
					} else {
						pessoaEndereco = formulario.indexOf(pessoaEndereco)
						if (pessoaEndereco > -1) {
							formulario = formularioTomador + $inputs[2].value;
						} else {
							perguntaRespostaFrequente = formulario.indexOf(perguntaRespostaFrequente)
							if (perguntaRespostaFrequente > -1) {
								formulario = formularioPerguntaFrequente + $inputs[1].value;
							}
						}
					}
					// aqui é o codigo que vai ser executado depois do tempo
					// determinado no segundo parametro
					window.location.assign(formulario);
					// o tempo que vai levar ate a funcao ser executada, em
					// milisegundos
				}, 1000);
			}
		} else {
			toastr.error(request.status, "Error ...");
		}
	});
});

A mensagem diz que nao encontrou endereço. Quem recebe as informações é action, e faltou você postar a controller.

Entendi. Mas entendo que o endereço do controller está correto…

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.netsoft.constantes.ConstantesNotaFiscal;
import br.com.netsoft.dto.todos.PessoaTipoPessoaDTO;
import br.com.netsoft.rest.NotaFiscalServicoRecurso;
import br.com.netsoft.servico.todos.PessoaTipoPessoaServico;

@RestController
public class PessoaTipoPessoaRecurso extends NotaFiscalServicoRecurso {

	private static final long serialVersionUID = -4709281968529110863L;

	@Autowired
	private PessoaTipoPessoaServico pessoaTipoPessoaServico;

	@PostMapping(value = "/PessoaTipoPessoaRecurso/salvar")
	public String salvar(@Valid PessoaTipoPessoaDTO dto, BindingResult result) {
		try {
			if (result.hasErrors()) {
				return salvar(result.getAllErrors());
			}
			pessoaTipoPessoaServico.salvar(dto);
		} catch (Exception e) {
			logger.error(e.getMessage());
			return mensagemErro(e);
		}
		return ConstantesNotaFiscal.MENSAGEM_SALVO_SUCESSO;
	}
}

Quando você debuga formulario + "Recurso/salvar", isso existe? O que é retornado?

Todos os formulários tem esta tag: .

No javascript esta tag vai no código nomeFormulario.name

“pessoa” está em minusculo no javascript e no post do Java o P está maiusculo. Veja se isso faz diferença.

Isto mesmo
Obrigado.