前一段时间,我尝试了一个基于Spring Boot的小示例,并以Scala作为语言,发现这种组合效果很好-实际上,当Scala程序最终在JVM中运行时,实际上并没有太大的惊喜。 我现在使用最新版本的Spring Boot和一些支持库更新了示例 。
为了非常快速地重新访问示例,这是一个非常简单的Web应用程序,带有用于管理通过JPA管理的“酒店”域对象的UI,该对象以scala的方式表示为:
import javax.persistence.Id
import javax.persistence.GeneratedValue
import java.lang.Long
import javax.persistence.Entity
import scala.beans.BeanProperty
import org.hibernate.validator.constraints.NotEmpty
@Entity
class Hotel {
@Id
@GeneratedValue
@BeanProperty
var id: Long = _
@BeanProperty
@NotEmpty
var name: String = _
@BeanProperty
@NotEmpty
var address: String = _
@BeanProperty
@NotEmpty
var zip: String = _
}
JPA批注进行得很好,但是可能会有一个额外的@BeanProperty批注,但这是JPA实现所必需的,因为这使scala编译器生成普通的Java Beans类型的getter和setter,而不是不会生成默认的Java Beans getter和setter。遵循Java Bean约定。
Spring Data使管理此域类型变得异常简单,它所需要的只是一个标记接口,并且它生成一个运行时实现:
import org.springframework.data.repository.CrudRepository
import mvctest.domain.Hotel
import java.lang.Long
trait HotelRepository extends CrudRepository[Hotel, Long]
现在,我有一个可用于管理酒店域的工具包:
//save or update a hotel
hotelRepository.save(hotel)
//find one hotel
hotelRepository.findOne(id)
//find all hotels
val hotels = hotelRepository.findAll()
//delete a hotel
hotelRepository.delete(id)
最后是一个控制器,用于使用此存储库管理UI流程:
@Controller
@RequestMapping(Array("/hotels"))
class HotelController @Autowired()(private val hotelRepository: HotelRepository) {
@RequestMapping(method = Array(RequestMethod.GET))
def list(model: Model) = {
val hotels = hotelRepository.findAll()
model.addAttribute("hotels", hotels)
"hotels/list"
}
@RequestMapping(Array("/edit/{id}"))
def edit(@PathVariable("id") id: Long, model: Model) = {
model.addAttribute("hotel", hotelRepository.findOne(id))
"hotels/edit"
}
@RequestMapping(method = Array(RequestMethod.GET), params = Array("form"))
def createForm(model: Model) = {
model.addAttribute("hotel", new Hotel())
"hotels/create"
}
@RequestMapping(method = Array(RequestMethod.POST))
def create(@Valid hotel: Hotel, bindingResult: BindingResult) = {
if (bindingResult.hasErrors()) {
"hotels/create"
} else {
hotelRepository.save(hotel)
"redirect:/hotels"
}
}
@RequestMapping(value = Array("/update"), method = Array(RequestMethod.POST))
def update(@Valid hotel: Hotel, bindingResult: BindingResult) = {
if (bindingResult.hasErrors()) {
"hotels/edit"
} else {
hotelRepository.save(hotel)
"redirect:/hotels"
}
}
@RequestMapping(value = Array("/delete/{id}"))
def delete(@PathVariable("id") id: Long) = {
hotelRepository.delete(id)
"redirect:/hotels"
}
}
这里也有一些问题,但应该说得通,自动连接存储库的方式有点不直观,必须为请求映射路径提供显式Array类型,并且方法可能会令人困惑。
除了这些小问题之外,代码也可以正常工作,可以使用它,我希望收到任何有关改进此示例方法的反馈。 这是此示例的git位置。
翻译自: https://www.javacodegeeks.com/2016/02/spring-boot-scala.html