Я использую Spring Boot с Kotlin и хочу вывести объект в браузер.
Entities.kt:
@Entity
class Person(
var name: String,
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null
)
@Entity
class Cat(
var name: String,
@ManyToOne var ownedBy: Person,
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null
)
HtmlController.kt:
@Controller
class HtmlController(private val repository: CatRepository) {
@GetMapping("/")
fun index(model: Model): String {
model["cats"] = repository.findAll()
return "index"
}
}
В моем шаблоне index я могу перебирать cat с помощью {#cats}{/cats}, но я хочу выгрузить все (например, чтобы увидеть, какие отношения доступны). Это возможно? Я попытался изменить контроллер выше на return respository.findAll().toString(), но это дает мне ошибку:
There was an unexpected error (type=Not Found, status=404).




При возврате String из ControllerSpring MVC предполагает, что вы указываете на файл представления. Поэтому он будет искать файл в какой-то настроенной папке, где имя файла является строковым представлением списка Cats. Этого, конечно же, не существует, и вы получаете 404.
Самый простой способ сделать это — создать конечную точку в стиле REST и вернуть данные в подходящем формате данных, например json. Мой пример с Java, но вы можете преобразовать его в Kotlin:
@RestController
public class CatRestController {
@Autowired
private CatRepository repository;
@RequestMapping(path = "/cats", method = RequestMethod.GET)
public List<Cat> getAllCats() {
return repository.findAll();
}
}
Spring Boot должен автоматически преобразовать список в json. Этот метод может работать, если его переместить на существующий контроллер Spring MVC, но я не проверял. У меня есть пример из обычного проекта Spring MVC (не Spring Boot), и сигнатура метода выглядит примерно так:
@RequestMapping("/cats.json")
public @ResponseBody List<Cat> getCats() {
Еще один совет: используйте плагин для браузера, который преобразует json в красиво напечатанный json :)