Example usage for org.springframework.web.bind.support WebDataBinderFactory createBinder

List of usage examples for org.springframework.web.bind.support WebDataBinderFactory createBinder

Introduction

In this page you can find the example usage for org.springframework.web.bind.support WebDataBinderFactory createBinder.

Prototype

WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, String objectName)
        throws Exception;

Source Link

Document

Create a WebDataBinder for the given object.

Usage

From source file:com.trenako.web.infrastructure.SearchRequestArgumentResolverTests.java

@Test
public void shouldResolveRequestAsSearchRequest() throws Exception {
    HttpServletRequest request = new MockHttpServletRequest();
    ((MockHttpServletRequest) request).setRequestURI("/trenako-web/rs/brand/acme/railway/fs");
    NativeWebRequest webRequest = mock(NativeWebRequest.class);
    when(webRequest.getNativeRequest()).thenReturn(request);

    WebDataBinderFactory binderFactory = mock(WebDataBinderFactory.class);
    when(binderFactory.createBinder(eq(webRequest), isA(SearchRequest.class), eq("")))
            .thenAnswer(new Answer<ExtendedServletRequestDataBinder>() {
                @Override//from  w w  w .j  a  v  a  2s  . c  om
                public ExtendedServletRequestDataBinder answer(InvocationOnMock invocation) throws Throwable {
                    Object[] args = invocation.getArguments();
                    SearchRequest req = (SearchRequest) args[1];
                    return new ExtendedServletRequestDataBinder(req, "");
                }
            });

    Object obj = resolver.resolveArgument(parSearchRequest, null, webRequest, binderFactory);

    assertNotNull(obj);
    assertTrue(obj instanceof SearchRequest);

    SearchRequest expected = new SearchRequest();
    expected.setBrand("acme");
    expected.setRailway("fs");

    assertEquals(expected, (SearchRequest) obj);
}

From source file:com.trenako.web.infrastructure.RangeRequestArgumentResolverTests.java

@Test
public void shouldResolveRequestForStringBasedRanges() throws Exception {
    MockHttpServletRequest request = new MockHttpServletRequest();
    request.addParameter("max", "47cc67093475061e3d95369d");
    request.addParameter("since", "47cc67093475061e3d95369e");
    request.addParameter("size", "50");
    request.addParameter("sort", "name");
    request.addParameter("dir", "desc");

    NativeWebRequest webRequest = mock(NativeWebRequest.class);
    when(webRequest.getNativeRequest()).thenReturn(request);

    WebDataBinderFactory binderFactory = mock(WebDataBinderFactory.class);
    when(binderFactory.createBinder(eq(webRequest), isA(RangeRequest.class), eq("")))
            .thenAnswer(new Answer<ExtendedServletRequestDataBinder>() {
                @Override//w w  w  .java2 s .  com
                public ExtendedServletRequestDataBinder answer(InvocationOnMock invocation) throws Throwable {
                    Object[] args = invocation.getArguments();
                    RangeRequest req = (RangeRequest) args[1];
                    return new ExtendedServletRequestDataBinder(req, "");
                }
            });

    Object obj = resolver.resolveArgument(parRangeRequest, null, webRequest, binderFactory);

    assertNotNull(obj);
    assertTrue(obj instanceof RangeRequest);

    assertEquals("max=47cc67093475061e3d95369d,since=47cc67093475061e3d95369e,size=50,sort=name: DESC",
            obj.toString());
}

From source file:de.iew.web.isc.spring.IscRequestMethodArgumentResolver.java

public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
        NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
    DSRequest dsRequest = new DSRequest();
    WebDataBinder binder = webDataBinderFactory.createBinder(nativeWebRequest, dsRequest, "dsRequest");
    binder.setFieldMarkerPrefix("__");

    // Man kann noch eigene Property Editoren konfigurieren
    //binder.registerCustomEditor();

    if (binder instanceof ServletRequestDataBinder) {
        /*//ww  w.  j  av  a  2 s . c o  m
        @TODO
                
        Wir machen es uns etwas leicht. Unser DSRequest Objekt muss
        eigentlich nur die isc_-Eigenschaften kennen. Dort ist auch isc_metaDataPreifx
        konfiguriert. Anhand dieses Prefix mssen wir die anderen Eiegenschaften auflsen.
         */
        ServletRequestDataBinder servletRequestDataBinder = (ServletRequestDataBinder) binder;
        HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();

        servletRequestDataBinder.bind(request);

        BindingResult bindingResult = binder.getBindingResult();
        modelAndViewContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX + "dsRequest", bindingResult);

        return dsRequest;
    } else {
        throw new UnsupportedOperationException(
                "Using " + binder.getClass() + " WebDataBinder is not supported.");
    }

}

From source file:com.trenako.web.infrastructure.RangeRequestArgumentResolverTests.java

@Test
public void shouldResolveRequestForDateBasedRangeRequests() throws Exception {
    MockHttpServletRequest request = new MockHttpServletRequest();
    request.addParameter("max", "2012-06-01T11:40:00");
    request.addParameter("since", "2012-06-01T11:30:00");
    request.addParameter("size", "50");
    request.addParameter("sort", "lastModified");
    request.addParameter("dir", "desc");

    NativeWebRequest webRequest = mock(NativeWebRequest.class);
    when(webRequest.getNativeRequest()).thenReturn(request);

    WebDataBinderFactory binderFactory = mock(WebDataBinderFactory.class);
    when(binderFactory.createBinder(eq(webRequest), isA(RangeRequest.class), eq("")))
            .thenAnswer(new Answer<ExtendedServletRequestDataBinder>() {
                @Override/*from  w w  w .j  a  v  a2s. c om*/
                public ExtendedServletRequestDataBinder answer(InvocationOnMock invocation) throws Throwable {
                    Object[] args = invocation.getArguments();
                    RangeRequest req = (RangeRequest) args[1];
                    return new ExtendedServletRequestDataBinder(req, "");
                }
            });

    Object obj = resolver.resolveArgument(parRangeRequest, null, webRequest, binderFactory);

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    RangeRequest rangeRequest = (RangeRequest) obj;
    assertNotNull(rangeRequest);
    assertNotNull("Since date is null", rangeRequest.getSince());
    assertNotNull("Max date is null", rangeRequest.getMax());

    assertEquals("01/06/2012 11:30:00", sdf.format(rangeRequest.getSince()));
    assertEquals("01/06/2012 11:40:00", sdf.format(rangeRequest.getMax()));

}

From source file:com.trenako.web.infrastructure.SearchRequestArgumentResolver.java

@Override
public Object resolveArgument(MethodParameter param, ModelAndViewContainer mavContainer,
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

    if (param.getParameterType().equals(SearchRequest.class)) {
        SearchRequest searchRequest = new SearchRequest();

        WebDataBinder webBinder = binderFactory.createBinder(webRequest, searchRequest, "");

        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
        PropertyValues pvs = new ServletRequestPathVariablesPropertyValues(request);
        webBinder.bind(pvs);//from   w w  w. j av a 2 s  .  c  om
        return searchRequest;
    }

    return UNRESOLVED;
}

From source file:com.trenako.web.infrastructure.RangeRequestArgumentResolver.java

@Override
public Object resolveArgument(MethodParameter param, ModelAndViewContainer mavContainer,
        NativeWebRequest webRequest, WebDataBinderFactory webBinder) throws Exception {

    if (param.getParameterType().equals(RangeRequest.class)) {

        RangeRequest rangeRequest = new RangeRequest(this.failbackRequest.getSort(),
                this.failbackRequest.getSize(), null, null);
        ServletRequest request = (ServletRequest) webRequest.getNativeRequest();

        PropertyValues propValues = new ServletRequestParameterPropertyValues(request);

        WebDataBinder wdb = webBinder.createBinder(webRequest, rangeRequest, "");
        wdb.registerCustomEditor(Sort.class, new SortPropertyEditor(propValues));
        wdb.bind(propValues);/*from  w  w w . j ava  2 s. co  m*/

        if (rangeRequest.getRangeType() == RangeTypes.DATES) {
            parseSinceDate(rangeRequest);
            parseMaxDate(rangeRequest);
        }

        return rangeRequest;
    }

    return UNRESOLVED;
}

From source file:com.fengduo.bee.commons.component.FormModelMethodArgumentResolver.java

/**
 * Create a model attribute from a String request value (e.g. URI template variable, request parameter) using type
 * conversion./*from   w ww  . j  a v  a  2  s  . c o  m*/
 * <p>
 * The default implementation converts only if there a registered
 * {@link org.springframework.core.convert.converter.Converter} that can perform the conversion.
 * 
 * @param sourceValue the source value to create the model attribute from
 * @param attributeName the name of the attribute, never {@code null}
 * @param parameter the method parameter
 * @param binderFactory for creating WebDataBinder instance
 * @param request the current request
 * @return the created model attribute, or {@code null}
 * @throws Exception
 */
protected Object createAttributeFromRequestValue(String sourceValue, String attributeName,
        MethodParameter parameter, WebDataBinderFactory binderFactory, NativeWebRequest request)
        throws Exception {
    DataBinder binder = binderFactory.createBinder(request, null, attributeName);
    ConversionService conversionService = binder.getConversionService();
    if (conversionService != null) {
        TypeDescriptor source = TypeDescriptor.valueOf(String.class);
        TypeDescriptor target = new TypeDescriptor(parameter);
        if (conversionService.canConvert(source, target)) {
            return binder.convertIfNecessary(sourceValue, parameter.getParameterType(), parameter);
        }
    }
    return null;
}

From source file:org.zht.framework.web.bind.resolver.FormModelMethodArgumentResolver.java

/**
 * Resolve the argument from the model or if not found instantiate it with
 * its default if it is available. The model attribute is then populated
 * with request values via data binding and optionally validated
 * if {@code @java.validation.Valid} is present on the argument.
 *
 * @throws org.springframework.validation.BindException
 *                   if data binding and validation result in an error
 *                   and the next method parameter is not of type {@link org.springframework.validation.Errors}.
 * @throws Exception if WebDataBinder initialization fails.
 *//* w w w .  j  a  va  2 s.  c  om*/
public final Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest request, WebDataBinderFactory binderFactory) throws Exception {
    String name = parameter.getParameterAnnotation(FormModel.class).value();

    Object target = (mavContainer.containsAttribute(name)) ? mavContainer.getModel().get(name)
            : createAttribute(name, parameter, binderFactory, request);

    WebDataBinder binder = binderFactory.createBinder(request, target, name);
    target = binder.getTarget();
    if (target != null) {
        bindRequestParameters(mavContainer, binderFactory, binder, request, parameter);

        validateIfApplicable(binder, parameter);
        if (binder.getBindingResult().hasErrors()) {
            List<BindingResult> list = (List<BindingResult>) request
                    .getAttribute(ValidateConstant.BINDING_RESULT_LIST_NAME, Integer.MAX_VALUE / 2 + 1);
            if (null == list) {
                list = new ArrayList<BindingResult>();
                request.setAttribute(ValidateConstant.BINDING_RESULT_LIST_NAME, list, 0);
            }
            list.add(binder.getBindingResult());
            request.setAttribute(ValidateConstant.BINDING_RESULT_HAS_ERROR, true, 0);
            //                if (isBindExceptionRequired(binder, parameter)) {
            //                    throw new BindException(binder.getBindingResult());
            //                }
        }
    }

    target = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType());
    mavContainer.addAttribute(name, target);

    return target;
}

From source file:org.opentides.web.processor.FormBindMethodProcessor.java

/**
 * Resolve the argument from the model or if not found instantiate it with
 * its default. The model attribute is then populated with request values 
 * via data binding and validated. If no validation error, the model
 * is retrieved from database and merged with the submitted form.
 *   /*from  ww  w  .  jav a  2 s .  c  o m*/
 * @throws BindException if data binding and validation result in an error
 * @throws Exception if WebDataBinder initialization fails.
 */
@SuppressWarnings("unchecked")
public final Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest nativeRequest, WebDataBinderFactory binderFactory) throws Exception {

    FormBind annot = parameter.getParameterAnnotation(FormBind.class);
    Class<?> clazz = parameter.getDeclaringClass();
    String name = getName(annot, parameter);
    HttpServletRequest request = (HttpServletRequest) nativeRequest.getNativeRequest();

    Method addForm = CacheUtil.getNewFormBindMethod(clazz);
    Object controller = beanFactory.getBean(parameter.getContainingClass());
    Object target = (addForm != null) ? addForm.invoke(controller, request)
            : BeanUtils.instantiateClass(parameter.getParameterType());
    MutablePropertyValues mpvs = new MutablePropertyValues(nativeRequest.getParameterMap());
    WebDataBinder binder = binderFactory.createBinder(nativeRequest, target, name);
    if (binder.getTarget() != null) {
        binder.bind(mpvs);
        if (binder.getValidator() != null)
            binder.validate();
        if (binder.getBindingResult().hasErrors()) {
            throw new BindException(binder.getBindingResult());
        }
        String method = request.getMethod().toLowerCase();

        // id should be the last segment of the uri
        String uri = request.getRequestURI();
        String sid = uri.substring(uri.lastIndexOf("/") + 1);
        Long id = StringUtil.convertToLong(sid, 0);

        // if target extends BaseEntity and for update, link target to database record
        if (("put".equals(method) || "post".equals(method)) && id > 0
                && BaseEntity.class.isAssignableFrom(parameter.getParameterType())) {
            // now retrieve record from database for updating
            Method updateForm = CacheUtil.getUpdateFormBindMethod(clazz);

            BaseEntity record = null;
            if (updateForm == null) {
                // no annotation, invoke from service
                Method getService = controller.getClass().getMethod("getService");
                if (getService == null) {
                    String message = "Cannot find method with @FormBind with update mode. "
                            + "Also, unable to find service associated to controller."
                            + "Please specify one that retrieves record from database.";
                    throw new InvalidImplementationException(message);
                }
                BaseCrudService<? extends BaseEntity> service = (BaseCrudService<? extends BaseEntity>) getService
                        .invoke(controller);
                record = (BaseEntity) service.load(sid);
            } else {
                // with annotation, invoke annotation
                record = (BaseEntity) updateForm.invoke(controller, sid, request);
            }

            if (record != null) {
                WebDataBinder updateBinder = binderFactory.createBinder(nativeRequest, record, name);
                updateBinder.bind(mpvs);
                mavContainer.addAllAttributes(updateBinder.getBindingResult().getModel());
                return updateBinder.getTarget();
            } else {
                String message = "Unable to find " + parameter.getParameterType().getSimpleName() + " with id="
                        + sid + " for update.";
                throw new DataAccessException(message);
            }
        } else if ("post".equals(method)) {
            mavContainer.addAllAttributes(binder.getBindingResult().getModel());
            return binder.getTarget();
        } else {
            throw new InvalidImplementationException(
                    "@FormBind argument annotation can only be used on POST or PUT methods.");
        }
    }
    mavContainer.addAllAttributes(binder.getBindingResult().getModel());
    return binder.getTarget();
}

From source file:com.fengduo.bee.commons.component.FormModelMethodArgumentResolver.java

/**
 * Resolve the argument from the model or if not found instantiate it with its default if it is available. The model
 * attribute is then populated with request values via data binding and optionally validated if
 * {@code @java.validation.Valid} is present on the argument.
 * //from ww w  .j  a va  2s  .c o  m
 * @throws org.springframework.validation.BindException if data binding and validation result in an error and the
 * next method parameter is not of type {@link org.springframework.validation.Errors}.
 * @throws Exception if WebDataBinder initialization fails.
 */
public final Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
        NativeWebRequest request, WebDataBinderFactory binderFactory) throws Exception {
    String name = parameter.getParameterAnnotation(FormBean.class).value();

    Object target = (mavContainer.containsAttribute(name)) ? mavContainer.getModel().get(name)
            : createAttribute(name, parameter, binderFactory, request);

    WebDataBinder binder = binderFactory.createBinder(request, target, name);
    target = binder.getTarget();
    if (target != null) {
        bindRequestParameters(mavContainer, binderFactory, binder, request, parameter);

        validateIfApplicable(binder, parameter);
        if (binder.getBindingResult().hasErrors()) {
            if (isBindExceptionRequired(binder, parameter)) {
                throw new BindException(binder.getBindingResult());
            }
        }
    }

    target = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType());
    mavContainer.addAttribute(name, target);

    return target;
}