Skip to content

Instantly share code, notes, and snippets.

@nakamura-to
Forked from kawasima/SafeResolver.java
Last active October 3, 2020 02:40
Show Gist options
  • Select an option

  • Save nakamura-to/11347570 to your computer and use it in GitHub Desktop.

Select an option

Save nakamura-to/11347570 to your computer and use it in GitHub Desktop.
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;
}
}
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) {
}
}
@canujohann
Copy link
Copy Markdown

情報共有ありがとうございます。
SafeResolverListenerはどこで読み込まれますか。web.xmlですか。

@nakamura-to
Copy link
Copy Markdown
Author

はい、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>

@uemuraj
Copy link
Copy Markdown

uemuraj commented Apr 28, 2014

ありがとうございます。私も参考にさせていただきました。

@bobbyjam99-zz
Copy link
Copy Markdown

SafeResolver参考にさせていただきました。この対応で副作用がありました。

BeanUtils, もしくはPropertyUtilsのdescribeを使用していると空文字に変換されてしまった箇所が原因でNoSuchMethodExceptionになってしまいます。使用している場合は他の対応にするかPropertyUtilsを拡張するかの対応が必要そうです。

@nakamura-to
Copy link
Copy Markdown
Author

@bobbyjam99 (cc: @kawasima)

情報ありがとうございます。

もし describe の呼び出し元が変更可能ならば、そこだけ例えば次のように書いて SafeResolver を使わないようにするのがいいかもしれませんね。

Map m = new BeanUtilsBean().describe(bean);

@nakamura-to
Copy link
Copy Markdown
Author

うーん、gistってmention効かないみたいですね。

@nakamura-to
Copy link
Copy Markdown
Author

@glad2121
Copy link
Copy Markdown

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;
    }

}

@nakamura-to
Copy link
Copy Markdown
Author

この方法、うまく動きそうですね。

@bobbyjam99-zz
Copy link
Copy Markdown

describeを拡張しちゃいました。。。こっちのほうがスマートですね!

@uemuraj
Copy link
Copy Markdown

uemuraj commented May 30, 2014

describe の件、私は hasNested() もオーバーライドして "class" に対してだけ false を返すようにしてみました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment