创建 Java Spring 引导端点以获取对象列表 json

Creating Java Spring Boot endpoint to obtain list of objects as json

我正在尝试创建一个端点,该端点 returns 对象列表作为 JSON。

当前对象结构如下:

units: [
        {
         id: #,
         order: #,
         name: ""
         concepts: [
                    {
                     id: #
                     name: ""
                    },
                    ...
         ]
        },
        ...
]

具有 4 个属性的单位列表,其中一个是另一个具有 2 个其他属性的对象列表。这就是我想要获得的结果。

我目前正在尝试在 UnitController 中执行以下操作:

@RequestMapping(method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public @ResponseBody List<Unit> getUnits() {
    return unitService.findAll();
}

但每当我 运行 应用程序并尝试 curl localhost:8080/units 时,我什么也得不到。这可能是因为我在控制器中有另一种方法,比如这个:

@RequestMapping("")
public String index(Map<String, Object> model) {
    List<Unit> units = unitService.findAll();
    model.put("units", units);
    return "units/index";
}

有人可以帮助我解决这个问题并告诉我我做错了什么吗?非常感谢。

编辑

好的,所以我将注释移到了 class

@Controller
@RequestMapping(value = "/units", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public class UnitController extends BaseController {
...
}

并尝试这样的端点:

@RequestMapping(method = RequestMethod.GET, value = "/units.json")
public @ResponseBody List<Unit> getUnits() {
    return unitService.findAll();
}

但是它curl localhost:8080/units.json仍然没有给我任何反应。

还忘了说我的 application.properties 文件没有 server.contextPath 属性.

这可能是因为控制器上没有 @RequestMapping 注释。 Spring boot 需要映射来确定发送 REST API 请求时需要调用哪个方法。例如。您需要 UnitController class 上的以下内容:

@RestController
@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, value = "/units")
public class UnitController {

如果您的控制器 class 已经有了,那么您需要为方法定义另一个映射,指定请求方法和可选的映射。例如

@RestController
@RequestMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, value = "/units")
public class UnitController {

   @RequestMapping(method = RequestMethod.GET)
   public List<Unit> method1(){..}

   @RequestMapping(method = RequestMethod.POST)
   public List<Unit> method2(){..}

   @RequestMapping(method = RequestMethod.GET, value = "/unit")
   public List<Unit> method3(){..}
}

对于上面的例子:

  • 向 /units 发送 GET 请求将导致调用 method1
  • 向 /units 发送 POST 请求将导致调用 method2
  • 向 /units/unit 发送 GET 请求将导致调用 method3

如果您的 application.properties 文件定义了 server.contextPath 属性,则需要将其附加到 baseurl,例如<host>:<port>/<contextPath>