Adobe CQ5 (Spring MVC やその他のフレームワークなど) のオブジェクトにリクエスト パラメータをバインドする方法を知っている人はいますか?
または、これを CQ5 で直接行う方法がない場合、これを行うためにサードパーティのフレームワークを統合したことのある人はいますか?
CQ5 自体にバインドするものは見つかりませんでした。ただし、CQ5 で Spring DataBinder クラスを使用できます。これは私が行っていることです。次のように、コンポーネント内で org.springframework.web.bind.ServletRequestDataBinder クラスを直接使用するだけです。
ServletRequestDataBinder dataBinder = new ServletRequestDataBinder(myModel, "myModel");
dataBinder.bind(slingRequest);
必要に応じて、 #getBindingResult() メソッドを介して dataBinder インスタンスから org.springframework.validation.BindingResult を取得できます。さらに、ServletRequestDataBinder#setConversionService(ConversionService) メソッドを介して使用するように org.springframework.core.convert.ConversionService を構成できます。
私が行っていることの 1 つは、Sling のサフィックスもバインドすることです。Sling サフィックスを使用する場合、可能な場合はディスパッチャー キャッシングを利用するために、URL サフィックスで ${key}=${value} パターンに従います。たとえば、/content/myApp/en_US/myPage.html/key1=value1/key2=value2.htmlの URL を指定すると、サフィックスを{"key1":"value1",の Map<String, String> に解析します。 "key2":"value2"} . これらの値をバインドするには、ServletRequestDataBinder を拡張し、 #addBindValues(MutablePropertyValues mpvs, ServletRequest request) メソッドをオーバーライドします。例えば:
public class SlingServletRequestDataBinder extends ServletRequestDataBinder {
public SlingServletRequestDataBinder(Object target, String objectName) {
super(target, objectName);
}
@Override
protected void addBindValues(MutablePropertyValues mpvs,
ServletRequest request) {
SlingHttpServletRequest slingHttpServletRequest = unwrap(request);
if (null == slingHttpServletRequest) {
return;
}
String suffix = slingHttpServletRequest.getRequestPathInfo().getSuffix();
Map<String, String> suffixParameters = // parse suffix into Map here...
mpvs.addPropertyValues(suffixParameters);
super.addBindValues(mpvs, request);
}
public static SlingHttpServletRequest unwrap(ServletRequest servletRequest) {
// immediate termination if we found one
if (servletRequest instanceof SlingHttpServletRequest) {
return (SlingHttpServletRequest) servletRequest;
}
while (servletRequest instanceof ServletRequestWrapper) {
servletRequest = ((ServletRequestWrapper) servletRequest).getRequest();
// immediate termination if we found one
if (servletRequest instanceof SlingHttpServletRequest) {
return (SlingHttpServletRequest) servletRequest;
}
}
return null;
}
}
上記は、Sling サフィックスと URL パラメーターの組み合わせで機能するはずです。たとえば、次のモデルがあるとします。
public class MyModel {
private String key1;
private String key2;
private String key3;
// getters and setters go here...
}
および/content/myApp/en_US/myPage.html/key1=value1/key2=value2.html?key3=value3の URL の場合、モデルは{"key1":"value1", "key2":"value2 になります。 ", "key3":"value3"} .