Статьи

Весенний ботинок со Scala

Некоторое время назад я опробовал небольшой пример на основе Spring Boot с Scala в качестве языка и обнаружил, что комбинация работает довольно хорошо — никаких больших сюрпризов на самом деле нет, так как программы Scala в конечном итоге выполняются в JVM. Теперь я обновил образец последней версией Spring Boot и некоторыми из вспомогательных библиотек.

Чтобы очень быстро вернуться к примеру, это очень простое веб-приложение с пользовательским интерфейсом для управления доменным объектом «Отель», управляемым через JPA, представленным в scala следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 вместо геттеров и сеттеров по умолчанию для scala, которые не ‘ следовать соглашениям Java Bean.

Spring Data делает смехотворно простым управление этим типом домена, все что ему требуется — это интерфейс маркера, который генерирует реализацию во время выполнения:

1
2
3
4
5
import org.springframework.data.repository.CrudRepository
import mvctest.domain.Hotel
import java.lang.Long
 
trait HotelRepository extends CrudRepository[Hotel, Long]

Теперь у меня есть набор инструментов для управления доменом отеля:

01
02
03
04
05
06
07
08
09
10
11
//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)

И, наконец, контроллер для управления потоком пользовательского интерфейса с этим хранилищем:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@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 этого образца .

Ссылка: Spring Boot со Scala от нашего партнера JCG Биджу Кунджуммен в блоге « Все и вся» .