2014-02-09 48 views
0

這些工具如何輸入從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年數據類型的好東西)我很樂意接受它。

+0

@BalusC:對於_years_沒有現成的東西嗎?一些可以驗證今年不再是當前版本的東西,默認情況下爲當前版本,給出最小值或默認值爲min 1901等(最後與實體一起使用,因此最終可以在「YEAR」柱)。這可能是部分bean驗證 - 看看上面的混亂。我相信這個需求一次又一次地出現 –

回答

0

可以聲明<f:selectItems />從豆用值填充它,所以像

@RequestScoped 
@ManagedBean 
public class Form { 

    private List<String> items = new ArrayList<>(); 

    @PostConstruct 
    public void init() { 
     for(int i=1900;i<2000;i++) { 
      items.add(i); 
     } 
    } 

    public List<String> getItems() { 
     return items; 
    } 
} 

,然後在你的頁面

<h:selectOneListbox value="#{form.year}" size="5"> 
    <f:selectItems value="#{form.items}" var="entry" 
     itemValue="#{entry}" itemLabel="#{entry}" /> 
</h:selectOneListbox> 
+0

好吧,你會盡快嘗試,並讓你知道 - 所以'YEAR'沒有什麼? –

+0

沒有什麼我知道的,因爲你需要自定義值 –

+0

跟着你的解決方案 - (不需要做'String.valueOf(i)')。儘管如此,我還是有點驚訝,我無法做到這一點 –