当前位置: 首页 > 知识库问答 >
问题:

将两个@GetMapping映射到同一个@RestController到Spring Boot

杨乐
2023-03-14

我需要映射两个GET方法,如下所示:

GET /tickets - Retrieves a list of tickets
GET /tickets/12 - Retrieves a specific ticket

但当我绘制这张地图时,Spring被搞糊涂了!

当我击中http://localhost:8080/tickets在Chrome中,服务器上的结果是:

DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "tickets"]

当我击中http://localhost:8080/tickets/12在Chrome中,服务器上的结果是:

QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory

我的Spring控制器是:

package wendelsilverio.api.ticket;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController("tickets")
public class TicketController {

    @Autowired
    private TicketRepository repository;

    @GetMapping
    public List<TicketEntity> getTickets() {
        return repository.findAll();
    }

    @GetMapping("/{id}")
    public Optional<TicketEntity> getTicket(@PathVariable("id") Long id) {
        return repository.findById(Long.valueOf(id));
    }

}

我的单元测试是:

package wendelsilverio.api.ticket;

import static org.hamcrest.CoreMatchers.is;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.Arrays;
import java.util.Optional;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

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

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private TicketController mockTicketController;

    @Test
    public void getTickets() throws Exception {
        given(mockTicketController.getTickets())
                .willReturn(Arrays.asList(new TicketEntity(1L, "First ticket"), new TicketEntity(2L, "Second ticket")));
        mockMvc.perform(get("tickets").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
                .andExpect(jsonPath("$[0].content", is("First ticket")))
                .andExpect(jsonPath("$[1].content", is("Second ticket")));
    }

    @Test
    public void getTicket12() throws Exception {
        Optional<TicketEntity> twelveTicket = Optional.of(new TicketEntity(12L, "Twelve ticket"));
        given(mockTicketController.getTicket(12L)).willReturn(twelveTicket);
        mockMvc.perform(get("tickets/12").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
                .andExpect(jsonPath("$.id", is(12L))).andExpect(jsonPath("$.content", is("Twelve ticket")));
    }

}

我正在使用Java11和SpringBoot2.1.6

共有1个答案

戚泰
2023-03-14

使用

@RestController
@RequestMapping("/tickets")
...
@GetMapping
...
@GetMapping("{id}")

在代码1中,@RestController(“tickets”)表示“创建名为“tickets”的bean”2)第二个URL(@GetMapping(“/{id}”))告诉“将id放在根目录下”(http://localhost:8080/ID)-因此控制器无法将“票证”转换为长票证。

 类似资料:
  • 问题内容: 我需要将两个表映射到一个类,但很难弄清楚。一个表是ROOMS,另一个表是TRAINERS。 ROOMS表: 培训人员表: 表应当加入了,和。 ROOMS表的主键是:。TRAINERS表的主键是:。 我需要通过查询这个数据,,,,和。 在SQL中,可能类似于: 我正在项目中其他地方使用ROOMS表,它已经映射为独立对象。是否有一种方法可以将其用作TRAINERS对象的子对象,或者将这两个

  • 我对下面的问题有很大的麻烦。我有一个实体“home”,我在代码中的两个不同位置使用它。问题是,需要根据使用实体的类将其映射到不同的表。 有办法做到我描述的那样吗?

  • 我有两个地图,键为整数,值为双倍。 我想创建第三个按键排序的映射,值将是两个映射的双精度列表。 地图1: Map2: 最终地图: 如上所述,如果一个地图中的一个键在另一个地图中丢失,则另一个地图的最终地图中的值应默认为0.00 我可以使用putAll方法将所有键放入第三张地图。但如何按照我的意愿设定这些值呢? 感谢阅读!

  • 问题内容: 我正在尝试建立一个PostgreSQL表,该表具有两个指向另一个表中相同主键的外键。 运行脚本时出现错误 sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系Company.stakeholder的父/子表之间的联接条件- 有多个链接表的外键路径。指定“ foreign_keys”参数,提供这些列的列表,这些列应被视为包含对父表的外键引用。 那

  • 我正在学习Hinbernate,所以如果我能将两个类映射到一个DB表,我的想法就被忽略了。 Ex: 虽然这两个类都映射到一个表,但让我们用字符串数据类型的一列来命名Employee。 Hibernate是否能够根据我用于创建的类在表中创建行。还是您认为应该有一个鉴别器列来区分类? 注意:类之间没有继承关系,它们是独立的。

  • 问题内容: 我正在寻找有关如何在Python中将一个范围值转换为另一范围值的想法。我正在从事硬件项目,正在从可返回一定范围值的传感器读取数据,然后使用该数据来驱动需要不同范围值的执行器。 例如,假设传感器返回的值在1到512的范围内,并且执行器由5到10的值驱动。我想要一个函数,我可以传递一个值和两个范围并取回该值映射到第二个范围。如果这样的函数被命名,则可以这样使用: 在此示例中,我希望输出为,