jakaruta.doc_024
最終投稿日:2026年07月26日
@Getter
@Setter
@NotBlank(message = "{error.required.name}", groups = Group1.class)
@Size(min = 3, max = 10, message = "{error.Size.name}", groups = Group2.class)
private String name;
@Getter
@Setter
@NotBlank(message = "{error.required.pref}", groups = Group1.class)
@Max(message = "{error.max.pref}", value = 10, groups = Group2.class)
private String pref;
error.required.name=名前は必須入力です(入力された値は「${validatedValue}」です)。
error.Size.name=この項目は{min}以上、{max}以下で記入してね。入力された文字は「${validatedValue}」でした。
error.required.pref=都道府県は必須入力です。
error.max.pref=都道府県は{value}以下だよ。
[form]タグ内を[f:validateBean]タグで囲う事で全てのUIにルールを適用できます。
ただひとつ問題があり、バッキングビーン側に「groups」属性を指定してないビーンバリデーションはどうなると思います?
答えは発火しないですw
@Getter
private String currentGroup = "jakarta.validation.groups.Default, view.validator.group.Group1";
~ 省略 ~
public void submit() {
String actionType = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap().get("actionType");
if (actionType.equals("DRAFT")) {
this.currentGroup = "jakarta.validation.groups.Default, view.validator.group.Group1";
} else {
this.currentGroup = "jakarta.validation.groups.Default, view.validator.group.GroupOrder";
}
// ~ バリデーションが通過した時の処理 ~
}
package view;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import jakarta.faces.context.ExternalContext;
import jakarta.faces.context.FacesContext;
import jakarta.faces.context.Flash;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
import view.validator.group.Group1;
import view.validator.group.Group2;
@Named(value = "sampleBean")
@ViewScoped
public class SampleBean implements Serializable {
private static final long serialVersionUID = 1L;
@Getter
private String currentGroup = "jakarta.validation.groups.Default, view.validator.group.Group1";
@Getter
@Setter
@NotBlank(message = "{error.required.name}", groups = Group1.class)
@Size(min = 3, max = 10, message = "{error.Size.name}", groups = Group2.class)
private String name;
@Getter
@Setter
@NotBlank(message = "{error.required.pref}", groups = Group1.class)
@Max(message = "{error.max.pref}", value = 10, groups = Group2.class)
private String pref;
public void changeGroup1() {
this.currentGroup = "jakarta.validation.groups.Default, view.validator.group.Group1";
}
public void changeGroupOrder() {
this.currentGroup = "jakarta.validation.groups.Default, view.validator.group.GroupOrder";
}
public void submit() {
// ~ バリデーションが通過した時の処理 ~
System.out.println("処理実行!");
}
public String goPost() {
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
flash.put("pram_name", "フラッシュスコープです");
return "next";
}
public String goGet() {
return String.format("next?faces-redirect=true&inpText=%s&munber=%d", this.name, 123);
}
public void goYahoo() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
try {
String paramName = URLEncoder.encode("テスト", StandardCharsets.UTF_8.toString());
String targetUrl = "https://www.yahoo.co.jp/?q=" + paramName;
externalContext.redirect(targetUrl);
} catch (IOException e) {
e.printStackTrace();
}
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="jakarta.faces.core"
xmlns:h="jakarta.faces.html">
<h:head>
<title>Hello World</title>
<h:outputStylesheet library="css" name="style.css" />
<script>
function change_rule(data){
if (data.status === 'success') {
let btn = document.getElementById("kakushi");
btn.click();
}
}
</script>
</h:head>
<h:body>
<h1>おはよう世界!</h1>
<h:form id="sample_form" prependId="false">
<h:messages errorClass="alert-danger" warnClass="alert-warning" infoClass="alert-info" layout="list" />
<f:validateBean validationGroups="#{sampleBean.currentGroup}">
<h:inputText id="inpText" value="#{sampleBean.name}" />
<BR />
<h:inputText id="pref" value="#{sampleBean.pref}"/>
<BR />
<h:commandButton value="下書き" actionListener="#{sampleBean.changeGroup1()}">
<f:ajax execute="@this" onevent="change_rule" />
</h:commandButton>
<BR />
<h:commandButton value="送信して保存" actionListener="#{sampleBean.changeGroupOrder()}">
<f:ajax execute="@this" onevent="change_rule" />
</h:commandButton>
<BR />
<h:commandButton id="kakushi" value="隠し" action="#{sampleBean.submit()}" tabindex="-1" style="display: none;" />
<BR />
<h:commandButton value="POST繊維" action="#{sampleBean.goPost()}" />
<BR />
<h:commandButton value="GET繊維" action="#{sampleBean.goGet()}" />
<BR />
<h:commandButton value="外部繊維" action="#{sampleBean.goYahoo()}" />
</f:validateBean>
</h:form>
</h:body>
</html>
ルールが切り替わる仕組みは前述の通りです。
『AJAX』の部分に注目して下さい。『render』属性がありませんよね。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="jakarta.faces.core"
xmlns:h="jakarta.faces.html">
<h:head>
<title>Hello World</title>
<h:outputStylesheet library="css" name="style.css" />
</h:head>
<h:body>
<h1>おはよう世界!</h1>
<h:form id="sample_form" prependId="false">
<h:messages errorClass="alert-danger" warnClass="alert-warning" infoClass="alert-info" layout="list" />
<f:validateBean validationGroups="view.validator.group.Group1">
<h:inputText id="inpText" value="#{sampleBean.name}" />
<BR />
<h:inputText id="pref" value="#{sampleBean.pref}"/>
<BR />
<h:commandButton value="下書き" action="#{sampleBean.submit()}">
<f:param name="actionType" value="DRAFT" />
</h:commandButton>
<BR />
<h:commandButton value="送信して保存" action="#{sampleBean.submit()}">
<f:param name="actionType" value="SAVE" />
</h:commandButton>
<BR />
<h:commandButton value="POST繊維" action="#{sampleBean.goPost()}" />
<BR />
<h:commandButton value="GET繊維" action="#{sampleBean.goGet()}" />
<BR />
<h:commandButton value="外部繊維" action="#{sampleBean.goYahoo()}" />
</f:validateBean>
</h:form>
</h:body>
</html>