我有@RestController,有以下映射:
@GetMapping(value = "/periods"/span>})
public PeriodInfoDto get(DateRange dateRange)
DateRange有三個建構式:
DateRange有三個建構式。
public class DateRange{
@DateTimeFormat(iso=DateTimeFormat.ISO.DATE)
private YearMonth start;
@DateTimeFormat(iso=DateTimeFormat.iso.DATE)
private YearMonth end;
public DateRange(YearMonth start, YearMonth end) {
this.start = start;
this.end = end;
}
public DateRange(YearMonth end, Period period) {
this(end.minus(period.minusMonths(1), end);
當客戶端發送一個請求時,會報告以下例外:
java.lang.IllegalStateException。沒有找到類的主要或單一的公共 的建構式。 com.example.domain.DateRange 的主要或單一的公共建構式,并且在 也沒有找到默認的建構式,在 org.springframework.beans.BeanUtils.getResolvableConstructor(BeanUtils.java:250) ~[spring-beans-5.3.5.jar:5.3.5]/p>
DateRange有一個主建構式,DateRange(YearMonth, YearMonth)。其他的建構式呼叫這個。
客戶端傳入的是 "DateRange(YearMonth, YearMonth)
客戶端傳入了一個完整的日期字串,如2021-01-01的結束/開始日期請求引數,但我只關心月份和年份。
是否有辦法告訴Spring在系結請求時使用DateRange(YearMonth start, YearMonth end)?
uj5u.com熱心網友回復:
堆疊跟蹤表明,Spring需要一個所謂的主建構式。對于Java來說,這意味著一個可以使用的單一建構式。由于你有2個,這個機制就失效了。
你可以解決這個問題。
你可以通過使用YearMonth和Period來移除建構式,并將其移動到一個工廠方法中,然后使用該方法代替建構式。
public class DateRange {
private YearMonth start;
private YearMonth end;
public DateRange(YearMonth start, YearMonth end) {
this.start = start;
this.end = end;
}
public static DateRange of(YearMonth end, Period period){
return new DateRange(end.minus(period.minusMonths(1), end)。
}
當使用格式2021-09而不是完整的日期時,Spring將自動使用YearMonthFormatter(從Spring 4.2開始可用)來從YearMonth轉換。因此,你不需要@DateTimeFormat注解的方式。
uj5u.com熱心網友回復:
你可以不添加新的建構式,而是將該邏輯轉移到一些實體方法中,如下面的代碼所示:
public class DateRange{
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private YearMonth start;
@DateTimeFormat(iso = DateTimeFormat.iso.DATE)
private YearMonth end;
public void init(YearMonth start, YearMonth end) {
this.start = start;
this.end = end;
}
public DateRange(YearMonth end, Period period) {
this.init(end.minus(period.minusMonths(1), end);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313440.html
標籤:
