編集: 問題を絞り込み、関連する質問をここに投稿しました。チェックアウトしてください!
HTML フォームの処理を簡単にするために動的プロキシを使用しようとしています。私は、Google App Engine で JSP を使用して、非常に単純な MVC セットアップ (派手なフレームワークなし) を使用しています。次の例外が発生し続けます。
javax.el.PropertyNotFoundException: Could not find property testValue in class com.sun.proxy.$Proxy7
at javax.el.BeanELResolver.toBeanProperty(BeanELResolver.java:430)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:290)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:231)
at org.apache.el.parser.AstValue.getValue(AstValue.java:123)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
...
よし、これがコードだ。まず、私がプロキシしているインターフェース:
public interface MyForm {
public String getTestValue();
}
次に、プロキシを作成するコード:
// imports omitted
public final class Forms {
private Forms() { }
public static <T> T fromRequest(
final Class<T> klass,
final HttpServletRequest request) {
Object proxy = Proxy.newProxyInstance(
klass.getClassLoader(),
new Class<?>[]{ klass },
new InvocationHandler() {
@Override public Object invoke(
Object proxy,
Method method,
Object[] args) throws Throwable {
return "Will this be returned?";
}
});
return (T)proxy;
}
}
次に「アクション」クラス:
// imports omitted
public class MyAction extends Action {
// Called by the controller, which forwards to the returned JSP
public String perform(HttpServletRequest request) throws Exception {
final MyForm form = Forms.fromRequest(MyForm.class, request);
request.setAttribute("form", form);
return "view.jsp";
}
}
最後に、JSP:
<html>
<body>
<div>${ form.testValue }</div>
</body>
</html>
ご覧のとおり、実際にはまだフォーム処理を行っていません。まず、動的プロキシを使用して概念実証を実装したいだけです。前述のとおり、上記のコードは機能しません。しかし、困ったことに、リクエスト属性を単純にプロキシに転送する匿名クラスにすると、うまくいきます! したがって、次の変更で修正されます。
request.setAttribute("form", new MyForm() {
@Override getTestValue() { return form.getTestValue(); }
});
ただし、インターフェイスの種類を匿名でサブクラス化する必要があると、プロキシの目的が無効になります。何が起こっているのか誰か教えてください。