10 Eylül 2019 Salı

SpringConverters @DateTimeFormat Anotasyonu - String'den Bir java.time Sınıfına Çevirir

Giriş
Şu satırı dahil ederiz
import org.springframework.format.annotation.DateTimeFormat;
Bu sınıf Spring Converters projesine ait. Spring 3 ile geliyor.  String'den Bir java.time Sınıfına Çevirir

Java 8
Java 8 ile Date ve Calendar sınıfları rafa kalktı. Dolasıyla String'den java.time.LocalDateTime gibi yeni sınıflara çevrim yapar diye düşünmek lazım. Açıklaması şöyle.
Supports formatting by style pattern, ISO date time pattern, or custom format pattern string. Can be applied to java.util.Date, java.util.Calendar, java.lang.Long, Joda-Time value types; and as of Spring 4 and JDK 8, to JSR-310 java.time types too.

Bu Anotasyon İle Kulllanılabilecek Sınıflar
Şu sınıflar ile beraber kullanılabilir.
java.time.LocalDate
java.time.LocalTime
java.time.LocalDateTime
java.time.ZonedDateTime
java.time.OffsetDateTime
java.time.OffsetTime

JPA ile Kullanım
Genellikle  @Entity olarak işaretli JPA sınıfları ile birlikte kullanılır. Açıklaması şöyle.
Spring 3 offers two new annotations that you can use to format numbers, date, and time bean properties and method parameters: @NumberFormat and @DateTimeFormat. You can use @NumberFormat to format any numeric primitives or java.lang.Number instances (such as BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, and Short). You can use @DateTimeFormat to format any java.util.Date, java.util.Calendar, java.util.Long (representing a date/time in milliseconds since the epoch January 1, 1970, 00:00:00 GMT), or Joda Time field/parameter. 
REST ile Kullanım
"Spring Boot and the LocalDate request parameter" yazısına bakabilirsiniz.
Bu yazıda REST ile gönderilen String değeri LocalDate nesnesine çevirmek için 2 farklı yöntemden bahsediliyor.

1. @DateFormat anotasyonu kullanmak
2. Converter arayüzünden kalıtan bir sınıfı kodlamak

iso Alanı
Örnek
Şöyle yaparız.
@Column( name = "UPDATED" , nullable = true )
@DateTimeFormat( iso = ISO.DATE_TIME )
private LocalDateTime updated;
Örnek
Şöyle yaparız
@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name,
                    @RequestParam(value = "date")
                    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
  return String.format("Hello %s! %s", name, date);
}
Böylece şu HTTP isteğini çözebilir
Request 
/hello?date=2020-05-20
Eğer bu anotasyon olmasaydı şu hatayı alırdık
Failed to convert value of type ‘java.lang.String’ to required type ‘java.time.LocalDate’
pattern Alanı
Örnek
Şöyle yaparız.
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dateOfBooking;
Örnek
Şöyle yaparız.
@DateTimeFormat(pattern="dd/MM/yyyy")  // or any pattern you prefer 
@Column(name = "START_DATE", columnDefinition="TIMESTAMP", nullable = false)
private LocalDateTime startDate;
Örnek
Şöyle yaparız.
@Entity
@Table(name="credit")
public class Credit extends BaseEntity{

  @Column
  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private Date date;
  ...
}

Hiç yorum yok:

Yorum Gönder