有谁知道将请求参数绑定到 adobe CQ5 中的对象的任何方式(如在 Spring MVC 或其他此类框架中)?
或者,如果没有办法直接在 CQ5 中执行此操作,是否有人集成了 3rd 方框架来执行此操作?
我还没有发现任何与 CQ5 本身绑定的东西。不过,您可以在 CQ5 中使用 Spring DataBinder 类,这就是我所做的。只需在组件中直接使用 org.springframework.web.bind.ServletRequestDataBinder 类,如下所示:
ServletRequestDataBinder dataBinder = new ServletRequestDataBinder(myModel, "myModel");
dataBinder.bind(slingRequest);
如果需要,可以通过 #getBindingResult() 方法从 dataBinder 实例中获取 org.springframework.validation.BindingResult。此外,您可以配置 org.springframework.core.convert.ConversionService 以通过 ServletRequestDataBinder#setConversionService(ConversionService) 方法使用。
我做的一件事也是绑定 Sling 后缀。我在我的 URL 后缀中遵循 ${key}=${value} 模式,以便在使用 Sling 后缀时尽可能利用调度程序缓存。例如,给定 URL 为/content/myApp/en_US/myPage.html/key1=value1/key2=value2.html,我们将后缀解析为{"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"}。