這些工具如何輸入從JSF在實體創建這一領域並將其轉換爲YEAR字段(獲得Data truncation
例外)。MySQL的YEAR場
我得到的最接近:
<h:outputLabel for="yearOfRelease">Year of release</h:outputLabel>
<h:inputText id="yearOfRelease"
value="#{movieController.movie.yearOfRelease}" redisplay="true"
converterMessage="Please enter date in yyyy-MM-dd format">
<f:convertDateTime pattern="yyyy-MM-dd" />
</h:inputText>
<h:message id="yearOfReleaseMessage" for="yearOfRelease" />
似乎並沒有找到一個轉換器來告訴JSF轉換爲一年。
整數是我唯一的選擇嗎?
另外理想情況下,我想要一個下拉菜單。 I found things like
<h:selectOneListbox value="#{form.year}" size="5">
<f:selectItem itemValue="1900" itemLabel="1900"/>
<f:selectItem itemValue="1901" itemLabel="1901"/> ... </h:selectOneListbox>
但肯定有辦法讓這種自動化?
我是JSF的新手,我寧願留香草JavaEE(沒有臉庫)。我在GlassFish 4
部分答案
// YEAR
private static final short MIN_YEAR = 1901;
private static final short MAX_YEAR = 2014; // (short) new
// java.util.Date().getYear(); // does not play with message
private static final List<Short> YEARS = new ArrayList<>(MAX_YEAR
- MIN_YEAR + 1);
static {
for (short i = MIN_YEAR; i <= MAX_YEAR; ++i) {
YEARS.add(i);
}
}
private static final String MIN_MSG = "Min release year: " + MIN_YEAR;
private static final String MAX_MSG = "Max release year: " + MAX_YEAR;
@Column(name = "year_of_release")
@NotNull(message = "Please enter the year of release of the movie")
@Min(value = 1901, message = MIN_MSG)
@Max(value = 2014, message = MAX_MSG)
private short yearOfRelease = 2014;
public List<Short> getYears() {
return YEARS;
}
而且形式:
<h:selectOneListbox id="yearOfRelease" redisplay="true"
value="#{movieController.movie.yearOfRelease}" size="8">
<f:selectItems value="#{movieController.movie.years}" var="entry"
itemValue="#{entry}" itemLabel="#{entry}" />
<f:ajax event="blur" render="yearOfReleaseMessage" />
</h:selectOneListbox>
如果有人能想出一些更優雅(像一些現成的年份下拉式選單,驗證@Past並轉換爲MySQL年數據類型的好東西)我很樂意接受它。
@BalusC:對於_years_沒有現成的東西嗎?一些可以驗證今年不再是當前版本的東西,默認情況下爲當前版本,給出最小值或默認值爲min 1901等(最後與實體一起使用,因此最終可以在「YEAR」柱)。這可能是部分bean驗證 - 看看上面的混亂。我相信這個需求一次又一次地出現 –