-
-
Save nakamura-to/11347570 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package example; | |
import org.apache.commons.beanutils.expression.DefaultResolver; | |
public class SafeResolver extends DefaultResolver { | |
@Override | |
public String next(String expression) { | |
String property = super.next(expression); | |
if ("class".equalsIgnoreCase(property)) { | |
return ""; | |
} | |
return property; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package example; | |
import javax.servlet.ServletContextEvent; | |
import javax.servlet.ServletContextListener; | |
import org.apache.commons.beanutils.BeanUtilsBean; | |
public class SafeResolverListener implements ServletContextListener { | |
@Override | |
public void contextInitialized(ServletContextEvent event) { | |
SafeResolver resolver = new SafeResolver(); | |
BeanUtilsBean.getInstance().getPropertyUtils().setResolver(resolver); | |
} | |
@Override | |
public void contextDestroyed(ServletContextEvent event) { | |
} | |
} |
はい、web.xmlに登録する必要があります。
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
id="WebApp_ID" version="2.4">
...
<listener>
<listener-class>example.SafeResolverListener</listener-class>
</listener>
...
</web-app>
ありがとうございます。私も参考にさせていただきました。
SafeResolver参考にさせていただきました。この対応で副作用がありました。
BeanUtils, もしくはPropertyUtilsのdescribeを使用していると空文字に変換されてしまった箇所が原因でNoSuchMethodExceptionになってしまいます。使用している場合は他の対応にするかPropertyUtilsを拡張するかの対応が必要そうです。
@bobbyjam99 (cc: @kawasima)
情報ありがとうございます。
もし describe
の呼び出し元が変更可能ならば、そこだけ例えば次のように書いて SafeResolver
を使わないようにするのがいいかもしれませんね。
Map m = new BeanUtilsBean().describe(bean);
うーん、gistってmention効かないみたいですね。
describe
でエラーになる件、これでどうですか?
public class SafeResolver extends DefaultResolver {
public String next(String expression) {
String property = super.next(expression);
if ("class".equalsIgnoreCase(property)
&& !property.equals(expression)) {
return "";
}
return property;
}
}
この方法、うまく動きそうですね。
describe
を拡張しちゃいました。。。こっちのほうがスマートですね!
describe の件、私は hasNested() もオーバーライドして "class" に対してだけ false を返すようにしてみました。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
情報共有ありがとうございます。
SafeResolverListenerはどこで読み込まれますか。web.xmlですか。