ScalaSpring靴

一段时间,我尝试了一个基于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值