3

Adobe CQ5 (Spring MVC やその他のフレームワークなど) のオブジェクトにリクエスト パラメータをバインドする方法を知っている人はいますか?

または、これを CQ5 で直接行う方法がない場合、これを行うためにサードパーティのフレームワークを統合したことのある人はいますか?

4

1 に答える 1

1

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"} .

于 2012-11-11T22:00:38.110 に答える