Не удается отправить JSON-ответ на запрос POST в Spring MVC-контроллере - PullRequest
0 голосов
/ 18 января 2019

У меня нет проблем, чтобы отправить список объектов в ответ на запрос POST и получить его в клиенте VueJs

@RequestMapping(value={"/data/parts"}, method = RequestMethod.POST)
@ResponseBody public List<Part> getPartsList( @RequestBody LookupForm lookupForm ) {
        return getService().findParts(lookupForm.getCode(), lookupForm.getName(), lookupForm.getWarehouseCode());
}

Но когда я пытаюсь ответить с помощью пользовательского класса Response (я даже добавил produces="application/json" в аннотации RequestMapping)

@RequestMapping(value={"/addPartsRequest"}, method = {RequestMethod.POST}, produces="application/json")
    @ResponseBody public Response addPartsRequest(@RequestBody PartsRequest partsRequest) {
        Response response = new Response("Fail","Your Request failed");
        PartsRequest newRequest = getService().addPartsRequest(partsRequest);
        if (newRequest != null){
            response = new Response("Ok", "The Ticket has been submitted.");
        }
        return response;
}

class Response {
    String message;
    String status;

    public Response() {
        // empty c-tor for serialization
    }

    public Response(String status, String message) {
        this.message = message;
        this.status = status;
    }
    // ... getters & setters omitted
    }

На стороне VueJ запрос отправлен с помощью axios.post

var headers = {
            'Content-Type': 'application/json'
      }
      axios.post(`${API_URL.orderApi}`, formData, {headers})
        .then(response => {
          const commitPayload = response.data.message;
          const status        = response.data.status;
          if(status === 'Ok'){
              this.$store.commit('setMessage', commitPayload)
          }else{
              this.$store.commit('setErrMessage', commitPayload)
          }
          this.$router.push('/parts')
        },
        error => {
          this.$store.commit('setErrMessage', 'Submit Order failed')
          this.$router.push('/parts')
        })

Vue UI клиент получает

Status Code: 406 Not Acceptable
Content-Type: text/html;charset=UTF-8
<html><head><title>Error</title></head><body>Not Acceptable</body></html>

Почему я могу ответить списком объектов и не могу ответить POJO и как исправить проблему? Спасибо.

PS. Проект зависит от jackson-databind v2.8.2 и пружины v4.3.1

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Оказывается, я отправлял запрос POST с телом json на контроллер, сопоставленный с URL с суффиксом 'htm'. Этот запрос вызывает конфликт с отображением mime 'text / html' и в результате сервер немедленно отвечает кодом 406.

0 голосов
/ 18 января 2019

Я правильно получаю ответ, когда делаю это от почтальона. Я полагаю, у вас есть добытчики и сеттеры.

использовать заголовок Accept: application / json

Пометить класс как реализующий сериализацию.

...