Как это работает ResponseBody и что он возвращает - PullRequest
1 голос
/ 28 мая 2020

У меня проблема. Дело в том, что @Reponsebody возвращает HTML DOM, но я этого не хочу. Но если я удалю тело ответа, он вернет ошибку в контроллере. Вот контроллер:

@GetMapping(value = "/isvoted")
public @ResponseBody List<Boolean> isvoted() {

    Authentication auth= SecurityContextHolder.getContext().getAuthentication();
    UserDetails userDetails = (UserDetails)auth.getPrincipal();
    Usuario usuario = (Usuario)usuarioService.findByUsername(userDetails.getUsername());
    Long id = usuario.getId();

    List<Tapas> tapas = tapaService.findAllTapas();
    List<Boolean> listavotos = new ArrayList<Boolean>();

    for (Tapas tapa : tapas) {
        if (voteService.selectVoteByUserAndTapa(id, tapa.getId()) != null) {
            listavotos.add(true);
        }else {
            listavotos.add(false);
        }
    }
    return listavotos;

Итак, метод возвращает список логических значений и ajax получает ответ, но ответ также возвращает тело html, как я могу реализовать для возврата только listavotos (список логических значений) без включения тела HTML.

это мой ajax запрос на получение:

const full = $('input[name="voto"]').attr("value", "\uf004").css({"font-family": "'Font Awesome 5 Free'"});

    $.ajax({
        type: "GET",
        url: "/isvoted",
        success: function(result) {

            if (result === undefined || result.length == 0){
                console.log("no hay votos");
            }else{
                for (var voto of result) {
                  if(voto === true){
                      console.log("voto true");
                      full.css({"font-weight": "900"});
                  }else{
                      console.log("voto false");
                      full.css({"font-weight": ''});
                  }
                }
            }

        },
        error: function(result) {
            console.log("error");
        }
    });

Возобновить, когда документ будет готов , он называется запросом получения ajax для kwnowing, если есть голоса, если есть голоса, он возвращает список логических значений (ответ), который он получает от контроллера, за который проголосовали, но также возвращает тело ответа (тело html ), но я не хочу этого. Я хочу, чтобы контроллер возвращал список в kwnow только в том случае, если элемент, за который он проголосовал, и если он проголосовал за стиль css, если не проголосовал, за другой стиль. Очень благодарен за вашу помощь. Если вам нужна дополнительная информация, только что опубликованная, и я поясню.

полный контроллер (не является restcontroller):

@Controller

publi c class VoteController {

@Autowired
private IVoteService voteService;

@Autowired
private IUsuarioService usuarioService;

@Autowired
private ITapasService tapaService;

private final Logger log = LoggerFactory.getLogger(getClass());

@GetMapping(value = "/isvoted")
@ResponseBody
public List<Boolean> isvoted(@RequestBody List<Boolean> listavotos) {

    Authentication auth= SecurityContextHolder.getContext().getAuthentication();
    UserDetails userDetails = (UserDetails)auth.getPrincipal();
    Usuario usuario = (Usuario)usuarioService.findByUsername(userDetails.getUsername());
    Long id = usuario.getId();

    List<Tapas> tapas = tapaService.findAllTapas();
    listavotos = new ArrayList<Boolean>();

    for (Tapas tapa : tapas) {
        if (voteService.selectVoteByUserAndTapa(id, tapa.getId()) != null) {
            listavotos.add(true);
        }else {
            listavotos.add(false);
        }
    }
    return listavotos;

}

@PostMapping(value = "/votecreate")
public String guardar(@Valid Vote vote, BindingResult result, Model model,
        @RequestParam(name = "tapa", required = true) Tapas tapa,
        RedirectAttributes flash, SessionStatus status) {

    if (result.hasErrors()) {
        List<ObjectError> errors = result.getAllErrors();
        for(ObjectError error : errors) {
            System.out.println("This is the error: " +error);
        }
        return "redirect:/home";
    }

    //String mensajeFlash = (vote.getId() != null) ? "voto quitado con con exito" : "votado con exito!";

    Authentication auth= SecurityContextHolder.getContext().getAuthentication();
    UserDetails userDetails = (UserDetails)auth.getPrincipal();
    Usuario usuario = (Usuario)usuarioService.findByUsername(userDetails.getUsername());

    //Tapas tapa = tapaService.findTapaById(Long.parseLong(tapaid));

    vote.setTapa(tapa);
    vote.setUsuario(usuario);

    voteService.save(vote);
    status.setComplete();
    //flash.addFlashAttribute("success", mensajeFlash);

    return "redirect:/home";
}

@GetMapping(value = "/votedelete/{tapaId}")
public String eliminar(@PathVariable(value = "tapaId") Long tapaId, RedirectAttributes flash) {

    //Tapas tapa = tapaService.findTapaById(tapaId);

    Authentication auth= SecurityContextHolder.getContext().getAuthentication();
    UserDetails userDetails = (UserDetails)auth.getPrincipal();
    Usuario usuario = (Usuario)usuarioService.findByUsername(userDetails.getUsername());
    Long userId = usuario.getId();
    log.debug("Usuario id:", userId);

    if (userId != null && tapaId != null) {

        Vote vote = voteService.selectVoteByUserAndTapa(userId, tapaId);
        log.debug("vote:", vote.getId());
        voteService.delete(vote.getId());
        flash.addFlashAttribute("success", "Voto eliminado con exito");

        return "redirect:/home/";
    }

    flash.addFlashAttribute("error", "El bar no existe en la base de datos");
    return "redirect:/bares/";
}

}

1 Ответ

0 голосов
/ 28 мая 2020

Дело в том, что когда в контроллере при сопоставлении / голосовании, jQuery может выполняться, когда пользователь вошел в систему (он получает данные аутентификации) и существует тапас (получить идентификатор тапа), потому что запрос репозиторий может быть успешно создан, но когда пользователь не вошел в систему, он возвращает строку макета тимелеафа, поэтому я просто добавляю условие, чтобы узнать, является ли возвращаемый контроллер строкой (DOM тимелеада), а не список логических значений в консольном журнале появляется сообщение о том, что пользователь не аутентифицирован, поэтому нет возможности показать результат (список логических значений)

if (result === undefined || result.length == 0)
    console.log("no hay votos");
else if (typeof(result) == "string")
    console.log("you are not logger, you should be logged to see the VOTES");
else
    for (var voto of result) {
        console.log(result);

        if (voto === true) {
            full.prop('disabled', true);
            console.log(voto);
        } else {
            full.prop('disabled', false);
            console.log(voto);
        }
    }
...