Не найдено сопоставление для HTTP-запроса с URI [/ api / Transactions] в DispatcherServlet с именем '' - PullRequest
0 голосов
/ 15 октября 2018

Я думал, что это стандартная конфигурация.Но я получаю 404 обратно.Где еще мне сконфигурировать Spring Boot?

@RestController
@RequestMapping("/api")
public class TransactionStatisticsController {

    public static final Logger logger = LoggerFactory.getLogger(TransactionStatisticsController.class);

    @RequestMapping(value = "/transactions",
                    method = RequestMethod.POST)
    public ResponseEntity sendTransaction(@RequestBody Transaction request) {
        logger.info( request.toString());
        return new ResponseEntity(HttpStatus.OK);
    }

}

Это мой тест.

@JsonTest
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
public class TransactionStatisticsRestTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private JacksonTester<Transaction> json;

    private static Transaction transaction;

    @BeforeClass
    public static void createTransaction(){
        BigDecimal amount = new BigDecimal(12.3343);
        transaction = new Transaction(amount.toString(),
                                      "2010-10-02T12:23:23Z");
    }

    @Test
    public void getTransactionStatus() throws Exception {

        final String transactionJson = json.write(transaction).getJson();
        mockMvc
                .perform(post("/api/transactions")
                .content(transactionJson)
                .contentType(APPLICATION_JSON_UTF8))
                .andExpect(status().isOk());
    }

    public static byte[] convertObjectToJsonBytes(Object object) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsBytes(transaction);
    }
}

Сделан запрос

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/transactions
       Parameters = {}
          Headers = {Content-Type=[application/json;charset=UTF-8]}
             Body = {"amount":"12.3343000000000007077005648170597851276397705078125","timestamp":"2010-10-02T12:23:23Z[UTC]"}
    Session Attrs = {}

Handler:
             Type = null

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 404
    Error message = null
          Headers = {}
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

Обновление: Iдобавлено сканирование компонентов, указывающее на базовый пакет.Я не вижу эту ошибку сейчас.Пожалуйста, смотрите комментарии, где есть ответ.

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Как и в разделе комментариев, требовалось только привязать расположение базового пакета сканирования компонентов.

@ Сканирование компонентов -> Настраивает директивы сканирования компонентов для использования с классами @Configuration.Обеспечивает поддержку параллельно с элементом Spring XML.Либо basePackageClasses (), либо basePackages () (или его значение псевдонима ()) могут быть указаны для определения конкретных пакетов для сканирования.Если определенные пакеты не определены, сканирование будет выполняться из пакета класса, который объявляет эту аннотацию.

0 голосов
/ 15 октября 2018

Кажется, использование @JsonTest даже не позволяет загрузить контекст приложения, отображение результатов не загружается, и его бросок 404, поэтому @JsonTest не является заменой для @SpringBootTest, это способ легко протестировать json serialization/de-serialization.

Согласно документации:

вы можете использовать аннотацию @JsonTest.@JsonTest автоматически настраивает доступный поддерживаемый преобразователь JSON, который может быть одной из следующих библиотек:

  1. Jackson ObjectMapper, любые bean-компоненты @JsonComponent и любые модули Джексона
  2. Gson
  3. Jsonb

Если при использовании Gson и удалении @JsonTest ваш тестовый прогон в порядке .. (добавить зависимость Gson в pom)

@SpringBootTest
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
public class DemoKj01ApplicationTests {

    @Autowired
    private MockMvc mockMvc;

    private static Transaction transaction;

    @BeforeClass
    public static void createTransaction(){
        BigDecimal amount = new BigDecimal(12.3343);
        transaction = new Transaction(amount.toString(),
                "2010-10-02T12:23:23Z");
    }

    @Test
    public void getTransactionStatus() throws Exception {

        //final String transactionJson = json.write(transaction).getJson();
        Gson gson = new Gson();
        String jsonRequest = gson.toJson(transaction);
        mockMvc
                .perform(post("/api/transactions")
                        .content(jsonRequest)
                        .contentType(APPLICATION_JSON_UTF8))
                .andExpect(status().isOk());
    }
0 голосов
/ 15 октября 2018

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

Этот код:

@RestController
@RequestMapping("/api")
public class TransactionStatisticsController {

    public static final Logger logger = LoggerFactory.getLogger(TransactionStatisticsController.class);

    @RequestMapping(value = "/transactions",
                    method = RequestMethod.POST)
    public ResponseEntity sendTransaction(@RequestBody Transaction request) {
        logger.info( request.toString());
        return new ResponseEntity(HttpStatus.OK);
    }

}

Это должно быть в вашем основном пакете, где находится

@SpringBootApplication
public class YourApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

этот основной класс.

Надеюсь, это поможет.

0 голосов
/ 15 октября 2018

Это потому, что в конце слэса в @RequestMapping(value = "/transactions/", method = RequestMethod.POST)

удалить его, и все будет в порядке: value = "/transactions/" => value = "/transactions"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...