2016-06-06 3 views
1

У меня есть контроллер отдыха:запрос Spring Rest Контроллер POST не работает

@RestController 
@RequestMapping("/query") 
public class QueryController { 

    @Autowired 
    private QueryService queryService; 

    @RequestMapping(value = "/select", method = RequestMethod.POST) 
    public @ResponseBody QueryResultDTO executeQuery(@RequestBody QueryDTO queryDTO) { 
     try { 
      QueryResultDTO queryResultDTO = queryService.executeQuery("select * from employees"); 
      queryResultDTO.setSuccessful(true); 
      return queryResultDTO; 
     } catch (SQLException e) { 
      QueryResultDTO queryResultDTO = new QueryResultDTO(); 
      queryResultDTO.setSuccessful(false); 
      queryResultDTO.setErrorMessage(e.getMessage()); 
      return queryResultDTO; 
     } 
    } 
} 

и я пытаюсь отправить запрос POST от контроллера AngularJS:

app.controller("AppCtrl",function($scope,$http) { 
    var app = this; 

    $scope.execute= function() { 
     $http({ 
      url: '../query/select', 
      method: "POST", 
      data: { 'message' : $scope.queryText } 
     }) 
      .then(function(response) { 
        $scope.queryResult = response.data; 
        console.log($scope.queryResult); 
        console.log($scope.queryText) 
       }, 
       function(response) { 
        console.log(response); 
       }); 
    } 

}); 

, но он не работает. Моя функция executeQuery в Spring Controller даже не называется.

Но когда я меняю RequestMethod на GET, он работает правильно.

@RestController 
@RequestMapping("/query") 
public class QueryController { 

    @Autowired 
    private QueryService queryService; 

    @RequestMapping(value = "/select", method = RequestMethod.GET) 
    public @ResponseBody QueryResultDTO executeQuery() { 
     try { 
      QueryResultDTO queryResultDTO = queryService.executeQuery("INSERT INTO employee VALUES (7,'dupa')"); 
      queryResultDTO.setSuccessful(true); 
      return queryResultDTO; 
     } catch (SQLException e) { 
      QueryResultDTO queryResultDTO = new QueryResultDTO(); 
      queryResultDTO.setSuccessful(false); 
      queryResultDTO.setErrorMessage(e.getMessage()); 
      return queryResultDTO; 
     } 
    } 
} 

и в угловых контроллерах:

app.controller("AppCtrl",function($scope,$http) { 
    var app = this; 

    $scope.execute= function() { 
     $http({ 
      url: '../query/select', 
      method: "GET", 
      data: { 'message' : $scope.queryText } 
     }) 
      .then(function(response) { 
        $scope.queryResult = response.data; 
        console.log($scope.queryResult); 
        console.log($scope.queryText) 
       }, 
       function(response) { 
        console.log(response); 
       }); 
    } 

}); 

Моей главная проблема в том, что я хотел бы отправить некоторые данные на мой контроллер Spring, а затем отправить JSON в ответ на мой угловой контроллер. Wheth GET метод отклика работает отлично, но когда я использую POST, метод контроллера даже не называется.

Edit:

Мой QueryDTO класс прост:

public class QueryDTO { 

    private String message; 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 
} 

А некоторые журналы с DEBUG уровне:

2016-06-06 09:28:23.697 DEBUG 7504 --- [nio-8090-exec-2] o.s.web.servlet.DispatcherServlet  : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling 
2016-06-06 09:28:23.698 DEBUG 7504 --- [nio-8090-exec-2] o.s.web.servlet.DispatcherServlet  : Successfully completed request 
+0

Каковы требуемые атрибуты для QueryDTO? Отправьте его код. Вы пытались сделать явным ответ? Определение [производит param] (http://pastebin.ubuntu.com/17053353/). – Lucio

+0

Наконец, вы также можете попробовать изменить фирму, добавив [параметр запроса] (http://pastebin.ubuntu.com/17053491/). – Lucio

+0

Как выглядит ваш QueryDTO? Вы проверяли журналы, если преобразователь сообщений Spring конвертирует JSON в QueryDTO. –

ответ

0

Попробуйте добавить consumes=MediaType.APPLICATION_JSON_VALUE в вашем методе.

@Transactional 
@RequestMapping(value = "/userlogincheck", method = RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody void userLoginCheck(@RequestBody UserImpl user, HttpServletRequest request, HttpServletResponse response) throws JSONException, IOException { 
JSONObject json = new JSONObject(); 
    try { 
     String email=user.getEmail(); 
     Long userId=user.getId(); 
     User loginData = accountService.userLoginCheck(email,userId); 
     if(loginData==null) 
     { 
      json.put("status", "FAILURE"); 
      json.put("message", "user does not exist"); 
      json.put("nextPage", "signIn"); 
     } 
     else 
     { 
      json.put("status", "SUCCESS"); 
      json.put("nextPage", updateState); 
     } 
    } 
    catch(Exception e) { 
     logger.info(e.getMessage()); 
    } 
    response.setContentType("application/json;charset=UTF-8"); 
    logger.info("response======" + json.toString()); 
    PrintWriter out = response.getWriter(); 
    out.write(json.toString()); 
} 
0

У меня был тот же вопрос и был в состоянии исправить это путем добавления CSRF токен на мой запрос (это только проблема, если вы используете WebSecurity). https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html

Эта ссылка описывает следующие шаги:

1) Добавить маркер в ваш заголовок, с thymeleaf вы делаете следующим образом (я думаю, что вы можете получить маркер из печенья, а):

<head> 
    <meta name="_csrf" th:content="${_csrf.token}"/> 
..... 
</head> 

2) Измените запрос, включив в него маркер CSRF следующим образом (я не знаком с угловым, но я думаю, вы можете задавать заголовок точно так же, как я сделал с Jquery):

var token = $("meta[name='_csrf']").attr("content"); 
    $.ajax({ 
      type: 'POST', 
      url: url, 
      data: JSON.stringify(newTodo), 
      headers: { 
      'X-CSRF-TOKEN': token 
      }, 
      contentType: 'application/json', 
      dataType: 'json', 
      success: function(){ 
      alert('callback '); 
     } 
     }); 
Смежные вопросы