ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[Eclipse] The project: xxxxxx which is referenced by the classpath, does not exist.

 
Eclipse 3.7 にて掲題のエラーが発生。
どうやら原因は workspace フォルダと project フォルダに同じ名前を付けていることにあったようだ。

[Java] java enum 列挙型名 省略

 
次のように列挙型を static インポートすれば、列挙型名を省略して書くことが出来る。

//次のようにオンデマンドstaticインポート文を使えば Statusの全ての列挙定数が型名なしで使える。

import static com.mycompany.expense.Status.*;

//列挙定数を個々にインポートすることも可能。
import static com.mycompany.expense.Status.SUBMITTED;
import static com.mycompany.expense.Status.ACCEPTED;

import java.util.EnumSet;

public class EnumTest {
public static void main(String[] args) {
System.out.println(EnumSet.of(SUBMITTED, ACCEPTED));
}
}
== 出力結果 ==
[SUBMITTED, ACCEPTED]

enum宣言
Status.java
package com.mycompany.expense;


public enum Status {
NEW, OPEN, SUBMITTED, ACCEPTED, REJECTED;
}

[Java] JSF2.0 faces-config.xml スタックオーバーフロー エラー

 
JSF2.0 で faces-config.xml の記述ミスのため、以下のようなスタックオーバーフローのエラーが発生した。
11 27, 2011 4:53:40 午後 org.apache.catalina.core.ApplicationDispatcher invoke

重大: サーブレット FacesServlet のServlet.service()が例外を投げました
java.lang.StackOverflowError
at javax.servlet.http.HttpServletResponseWrapper.setStatus(HttpServletResponseWrapper.java:185)
at com.sun.faces.application.ViewHandlerResponseWrapper.setStatus(ViewHandlerResponseWrapper.java:88)
...
at com.sun.faces.context.ExternalContextImpl.setResponseStatus(ExternalContextImpl.java:847)
at com.sun.faces.context.ExceptionHandlerImpl.throwIt(ExceptionHandlerImpl.java:264)
at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:142)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
...
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:674)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:462)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:401)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:546)
at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:364)
at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:154)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:674)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:462)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:401)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:546)
at com.sun.faces.application.view.JspViewHandlingStrategy.executePageToBuildView(JspViewHandlingStrategy.java:364)
at com.sun.faces.application.view.JspViewHandlingStrategy.buildView(JspViewHandlingStrategy.java:154)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
対策
faces-config.xml において以下のように JSF2.0 のスキーマを正しく指定する。
<?xml version="1.0"?>

<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">

</faces-config>
参考
Problem while upgrading to JSF 2.0
http://stackoverflow.com/questions/4849351/problem-while-upgrading-to-jsf-2-0
How to mix annotations with faces-config.xml
http://stackoverflow.com/questions/7519151/how-to-mix-annotations-with-faces-config-xml

[Java] java javax validation 相関チェック

 
Bean Validation 複数フィールドの相関チェックのサンプルコード

参考
メソッドに付与すると複数のフィールドにアクセスできるようなるため、複数フィールドにアクセスするようなValidationや複雑なロジックも記述できるようになります。
http://d.hatena.ne.jp/yamkazu/20110206/1296985545

Beanクラス
import javax.validation.constraints.AssertTrue;


public class Person {
private boolean isMarried;
private Person partner;

public boolean isMarried() {return isMarried;}
public void setMarried(boolean isMarried) {this.isMarried = isMarried;}
public Person getPartner() {return partner;}
public void setPartner(Person partner) {this.partner = partner;}

@AssertTrue(message="結婚しているなら相手がいるはず")
public boolean isMarriedImpliesHasPartner() {
return !isMarried || partner != null;
}
}
テストコード
import java.util.Set;


import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

public class MultiFieldValidateTest {

private Validator validator;

@Before
public void before() throws Exception {
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.getValidator();
}
@Test
public void testInvalidPerson() {
Person person = new Person();
person.setMarried(true);
Set<ConstraintViolation<Person>> violations = validator.validate(person);
assertEquals(violations.size(), 1);
printViolations(violations);
}
@Test
public void testValidPerson() {
Person person = new Person();
person.setMarried(true);
person.setPartner(new Person());
Set<ConstraintViolation<Person>> violations = validator.validate(person);
assertEquals(violations.size(), 0);
}

private void printViolations(Set<ConstraintViolation<Person>> violations) {
for (ConstraintViolation<Person> violation : violations) {
StringBuilder sb = new StringBuilder();
sb.append("[Path]" + violation.getPropertyPath() + " ");
sb.append("[Value]" + violation.getInvalidValue() + " ");
sb.append("[Message]" + violation.getMessage());
System.err.println(sb.toString());
}
}
}
出力結果
[Path]marriedImpliesHasPartner [Value]false [Message]結婚しているなら相手がいるはず

[Java] method="post" enctype="multipart/form-data" のフォームから getParameter でパラメータを取得するには

 
<form action="foo" method="post" enctype="multipart/form-data">
<input type="text" name="bar" />

上のような属性のフォームからサーブレットの request.getParameter で値を取得するには @MultipartConfig アノテーションを付加すればよい。
@WebServlet("/foo")

@MultipartConfig(maxFileSize = 100000)
public class Foo extends HttpServlet {

次のページ