Тест почтальона проходит хорошо, но ajax ошибся "Требуется тело запроса" - PullRequest
0 голосов
/ 14 января 2019

Я хочу отправить идентификаторы пользователя на контроллер, чтобы я мог получить реальные имена. например:

отправить: 1 3 5 Результат: Том Джастин Альбер

@RequestMapping(value="/batch",method=RequestMethod.GET)
public String getMore(@RequestBody String userids) {
    String result="";
    String[] ids=userids.split(" ");
    for (String id : ids) {
    Users users =   usersService.findById(Integer.parseInt(id));
    if(users!=null) {
        result= (result+" " + users.getRealname()).trim();
    }
    }
    return result;
}

AJAX коды следующим образом

var urln="http://localhost:8080/users/batch";
        $.ajax({
            type: "GET",
            url: urln,
            data:‘1 3’,
            dataType:'text',
            success: function (data) {
                alert(data);
            },
            error: function (XMLHttpRequest, textStatus,
                             errorThrown) {
                alert(textStatus);
            }
        });

показывает ошибку следующим образом

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.coolspen.rjb.controller.UsersController.getMore(java.lang.String)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:166)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:791)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Required request body is missing: public java.lang.String com.coolspen.rjb.controller.UsersController.getMore(java.lang.String)

но почтальон идет хорошо, результат следующий:

postman goes well

Ответы [ 4 ]

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

Попробуйте это;

Ваши переменные

var splitCondition = "1 3";

var urln="http://localhost:8080/users/batch?splitCondition";  // <= i have changed this

Ваш Ajax;

$.ajax({
        type: "GET",
        url: urln,
        accept : "text/html",         // <= changed these lines
        dataType : "html",            // <= changed these lines
        success: function (data) {

            alert(data);
        },
        error: function (XMLHttpRequest, textStatus,
                         errorThrown) {
            alert(textStatus);
        }
    });

Ваш контроллер (обновленный контроллер)

@RequestMapping(value="/batch",method=RequestMethod.GET)
@ResponseStatus(value=HttpStatus.OK)
public @ResponseBody String getMore(@RequestParam(value="splitCondition",required=false,defaultValue="")String userids) {
    String result="";
    String[] ids=userids.split(" ");
    for (String id : ids) {
    Users users =   usersService.findById(Integer.parseInt(id));
    if(users!=null) {
        result= (result+" " + users.getRealname()).trim();
    }
    }
    return result;
}
0 голосов
/ 14 января 2019

Вам необходимо добавить contentType в ваш код ajax, чтобы сообщить серверу, какие данные вы отправляете. Попробуйте следующее:

var urln="http://localhost:8080/users/batch";
    $.ajax({
        type: "GET",
        url: urln,
        data:‘1 3’,
        dataType:'text',
        contentType: 'text/plain',
        success: function (data) {
            alert(data);
        },
        error: function (XMLHttpRequest, textStatus,
                         errorThrown) {
            alert(textStatus);
        }
    });

dataType указывает тип данных, которые вы ожидаете от сервера , тогда как contentType указывает тип данных, которые вы отправляете на сервер . Поскольку почтальон по своей природе устанавливает заголовок, включающий этот тип содержимого, тест почтальона проходит успешно.

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

Вы можете увидеть эту ссылку QueryParam для отправки запроса с GET.

http://localhost:8080/users/batch?userids=1 3
0 голосов
/ 14 января 2019

Вам нужно установить данные следующим образом:

data:{userids: "1 3"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...