GVKun编程网logo

Spring中WebDataBinder使用详解(spring的web)

26

以上就是给各位分享Spring中WebDataBinder使用详解,其中也会对spring的web进行解释,同时本文还将给你拓展005-spring-data-elasticsearch3.0.0.0

以上就是给各位分享Spring中WebDataBinder使用详解,其中也会对spring的web进行解释,同时本文还将给你拓展005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展、3.13、@InitBinder 和 WebDataBinder、Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据、android.databinding.InverseBindingAdapter的实例源码等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Spring中WebDataBinder使用详解(spring的web)

Spring中WebDataBinder使用详解(spring的web)

这篇文章主要为大家详细介绍了Spring中WebDataBinder的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Spring MVC Validator @InitBinder and WebDataBinder;Validator是一个用来我们自定义验证的sping接口,WebDataBinder 绑定你的自定义参数,你直接在你的控制器类中通过@InitBinder 注解的方式配置 Web 数据绑定.registerCustomEditor()是一个属性编辑器,比如自定义的日期编辑它绑定web请求参数到JavaBean的属性;

下面一个例子,我们创建一个JavaBean(username, password, email and date of birth of a user),我们创建两个自定义的验证类.第一个,我们验证用户名和密码.第二个,验证邮箱,

在Eclipse中Demo的结构

Validator 是一个有两个方法的接口;

boolean supports(Class> clazz) : 检验参数是否验证成功的实例类;

void validate(Object target, Errors errors) : 如果 supports() 方法返回真,  target object 合法. Errors.rejectValue() 方法用一个字段名注册错误信息;

UserValidator.java

package com.concretepage.validators; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import com.concretepage.User; @Component public class UserValidator implements Validator { @Override public boolean supports(Class> clazz) { return User.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { User user = (User)target; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "","Username is empty"); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "", "Password is empty"); if (user.getName().length()

EmailValidator.java

package com.concretepage.validators; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import com.concretepage.User; @Component public class EmailValidator implements Validator { @Override public boolean supports(Class> clazz) { return User.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { User user = (User)target; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "","Email is empty"); if (!user.getEmail().contains("@")) { errors.rejectValue("email","", "Email is not valid."); } } }

User.java

package com.concretepage; import java.util.Date; public class User { private String name; private String password; private String email; private Date dob; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getpassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getdob() { return dob; } public void setdob(Date dob) { this.dob = dob; } }

MyWorldController

package com.concretepage; import java.text.SimpleDateFormat; import java.util.Date; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.modelattribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.concretepage.validators.EmailValidator; import com.concretepage.validators.UserValidator; @Controller @RequestMapping("/myworld") public class MyWorldController { @Autowired private UserValidator userValidator; @Autowired private EmailValidator emailValidator; @RequestMapping(value="signup", method = RequestMethod.GET) public ModelAndView user(){ return new ModelAndView("user","user",new User()); } @InitBinder public void dataBinding(WebDataBinder binder) { binder.addValidators(userValidator, emailValidator); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, "dob", new CustomDateEditor(dateFormat, true)); } @RequestMapping(value="save", method = RequestMethod.POST) public String createuser(@modelattribute("user") @Valid User user,BindingResult result, ModelMap model) { if(result.hasErrors()) { return "user"; } System.out.println("Name:"+ user.getName()); System.out.println("Email:"+ user.getEmail()); System.out.println("Date of Birth:"+ user.getdob()); model.addAttribute("msg", "Welcome to My World!"); return "success"; } }

Form页面表单

User Name:

Password :

Email :

Date of Birth :

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。

上一篇:Spring MVC的优点与核心接口_动力节点Java学院整理下一篇:Spring Boot实战之逐行释义Hello World程序 热门搜索:

showModelessDialog()使用详解 

Genius使用详解 

spring注解 

Vista中使用率最高的11条命令使用详解 

JavaScript中this关键字使用方法详解 

相关文章

Spring中WebDataBinder使用详解

2021-11-19阅读(9135)评论(0)推荐()

这篇文章主要为大家详细介绍了Spring中WebDataBinder的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

简单了解如何在spring中使用RabbitMQ

2021-11-05阅读(3148)评论(0)推荐()

这篇文章主要介绍了简单了解如何在spring中使用RabbitMQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

dubbo在Spring和Spring Boot中的使用详解

2021-10-18阅读(9729)评论(0)推荐()

这篇文章主要介绍了dubbo在Spring和Spring Boot中的使用详解,需要的朋友可以参考下

spring boot(三)之Spring Boot中Redis的使用

2021-10-06阅读(4245)评论(0)推荐()

这篇文章主要介绍了spring boot(三)之Spring Boot中Redis的使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下

Spring中常用注解的详细介绍

2021-11-19阅读(9943)评论(0)推荐()

这篇文章主要介绍了Spring中常用注解的详细介绍的相关资料,需要的朋友可以参考下

详解spring容器的使用流程

2021-11-05阅读(4566)评论(0)推荐()

今天给大家带来的是关于Java的相关知识,文章围绕着spring容器的使用流程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

Spring Security 在 Spring Boot 中的使用详解【集中式】

2021-11-19阅读(9378)评论(0)推荐()

这篇文章主要介绍了Spring Security 在 Spring Boot 中的使用【集中式】,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作...

取消

有人回复时邮件通知我

提交评论

© 2021 小编 

工信部备案号:琼ICP备2022000316号

005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展

005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展

1.8、Spring 数据扩展

  这些扩展使 Spring Data 在各种环境下的使用成为可能。目前大部分的整合都是针对 Spring MVC。

1.8.1、Querydsl 扩展

  Querydsl 是一个框架,它可以通过流畅的 API 构建静态类型的 SQL 查询。

  几个 Spring Data 模块通过 QueryDslPredicateExecutor 提供与 Querydsl 的集成。

示例、QueryDslPredicateExecutor 接口

public interface QueryDslPredicateExecutor<T> {
//查找并返回与Predicate匹配的单个实体
  Optional<T> findById(Predicate predicate);  
//查找并返回与谓词匹配的所有实体
  Iterable<T> findAll(Predicate predicate);   
//返回匹配Predicate的实体的数量
  long count(Predicate predicate);            
//判断返回与Predicate匹配的实体是否存在
  boolean exists(Predicate predicate);        

  // … more functionality omitted.
}
View Code

要使用 Querydsl 支持,只需在存储库接口上扩展 QueryDslPredicateExecutor 即可。

interface UserRepository extends CrudRepository<User, Long>, QueryDslPredicateExecutor<User> {
}

以上使用 Querydsl 谓词可以编写类型安全查询。

Predicate predicate = user.firstname.equalsIgnoreCase("dave").and(user.lastname.startsWithIgnoreCase("mathews"));

userRepository.findAll(predicate);

1.8.2、web 支持

  如果模块支持存储库编程模型,则 Spring Data 模块附带各种 Web 支持。与 Web 相关的东西需要类路径上的 Spring MVC JAR,其中一些甚至提供了与 Spring HATEOAS 的集成。通常,通过在 JavaConfig 配置类中使用 @EnableSpringDataWebSupport 注释来启用集成支持。

  启用 web 支持  

@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}

  或者 xml 配置

<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />

<!-- If you''re using Spring HATEOAS as well register this one *instead* of the former -->
<bean class="org.springframework.data.web.config.HateoasAwareSpringDataWebConfiguration" />
View Code

基本的 web 支持

  上面显示的配置设置将注册一些基本组件:

    DomainClassConverter 使 Spring MVC 能够根据请求参数或路径变量来解析存储库管理的域类的实例。

    HandlerMethodArgumentResolver 实现,以便 Spring MVC 根据请求参数解析 Pageable 和 Sort 实例。

DomainClassConverter

  DomainClassConverter 允许您直接在 Spring MVC 控制器方法签名中使用域类型,因此您不必通过存储库手动查找实例:

@Controller
@RequestMapping("/users")
class UserController {

  @RequestMapping("/{id}")
  String showUserForm(@PathVariable("id") User user, Model model) {

    model.addAttribute("user", user);
    return "userForm";
  }
}
View Code

  正如你所看到的,该方法直接接收一个用户实例,不需要进一步查找。通过让 Spring MVC 首先将路径变量转换为域类的 id 类型并最终通过在为域类型注册的存储库实例上调用 findById(...)来访问实例,可以解决该实例。

  目前,存储库必须实施 CrudRepository 才有资格被发现用于转换。

HandlerMethodArgumentResolvers for Pageable and Sort

  上面的配置片段还注册了 PageableHandlerMethodArgumentResolver 以及 SortHandlerMethodArgumentResolver 的一个实例。注册使页面和排序成为有效的控制器方法参数  

@Controller
@RequestMapping("/users")
class UserController {

  private final UserRepository repository;

  UserController(UserRepository repository) {
    this.repository = repository;
  }

  @RequestMapping
  String showUsers(Model model, Pageable pageable) {

    model.addAttribute("users", repository.findAll(pageable));
    return "users";
  }
}
View Code

  此方法签名将导致 Spring MVC 尝试使用以下默认配置从请求参数派生 Pageable 实例:

表 1. 对 Pageable 实例评估的请求参数

page

您想要检索的页面,索引为 0,默认为 0。

size

要检索的页面大小,默认为 20。

sort

属性应该按格式属性 property(,ASC | DESC)排序。默认排序方向是升序。如果您想切换路线,请使用多个排序参数,例如 ?sort=firstname&sort=lastname,asc.

更多 spring 扩展以及支持 web 支持请查看

 

3.13、@InitBinder 和 WebDataBinder

3.13、@InitBinder 和 WebDataBinder

  这一部分示例见这个项目的 mvc 分支下的 WebDataBinderController.java


① 用@InitBinder自定义数据绑定

  用@InitBinder注解的控制器方法,允许你直接在你的控制器类中配置 Web 数据绑定。@InitBinder标记初始化WebDataBinder的方法,WebDataBinder被用于填充被注解的处理方法的命令和表单对象参数。

  这些初始化绑定器(Init-binder)方法支持@RequestMapping方法支持的所有参数,处理命令/表单对象以及相关的校验结果对象。初始化绑定器方法必须不带返回值,所以它们通常被声明为 void 的。典型的参数包括WebDataBinderWebRequest或者java.util.Locale,允许用代码方式注册特定上下文的编辑器(context-specific editors)。

  下面的例子演示了使用@InitBinder为所有的java.util.Date表单属性配置一个CustomDateEditor

@Controller
public class MyFormController 
{
    @InitBinder
    protected void initBinder(WebDataBinder binder) 
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

    // ...
}

  相对地,从 Spring 4.2 开始,考虑使用addCustomFormatter来指定Formatter实现以代替PropertyEditor实例。如果你恰好在一个共享的FormattingConversionService中也有一个个基于Formatter的设置(setup),这会非常用,同样的规则可以用重用于控制器指定的绑定规则的变化:

@Controller
public class MyFormController 
{
    @InitBinder
    protected void initBinder(WebDataBinder binder) 
    {
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
    // ...
}

② 配置一个自定义的WebBindingInitializer

  为了表达(externalize)数据绑定初始化,你可以提供一个自定义的WebBindingInitializer接口实现,然后你可以通过为RequestMappingHandlerAdapter来提供一个自定义 Bean 配置来启动WebBindingInitializer,所以要重写默认配置。

  下面的例子来自 PetClinic 应用程序(虽然文档上说了一下,可我也不知道这个项目在哪里……),展示了一个配置,使用一个自定义WebBindingInitializer接口实现——org.springframework.samples.petclinic.web.ClinicBindingInitializer,它配置的PropertyEditors需要几个控制器。

<bean>
    <property name="cacheSeconds" value="0"/>
    <property name="webBindingInitializer">
        <bean/>
    </property>
</bean>

  @InitBinder方法也可以定义在一个带有@ControllerAdvice注解的类中,在这种情况下,它们用于匹配控制器。这提供了一个使用WebBindingInitializer的代替方法。详情见“使用@ControllerAdvice@RestControllerAdvice通知控制器一节”。

Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据

Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据

Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据

本例基于 Android 官方 DataBinding,在 RecyclerView 上实现一个简单需求:点击一个 button 按钮,增加一个数据元素,并更新的 view 上。

(1)首先写一个布局,这个布局上面放一个按钮 button,下面一个标准 Android RecyclerView。Button 按钮的实现一个简单的功能:没点击一次就增加一个数据元素,然后更新到 RecyclerView。recycler_view_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加元素" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>


(2)和附录文章 1,2,写数据模型 User,对比这个 User 和附录 1,2 的 User 建模时候的异同,User.java:
package zhangphil.test;

import android.databinding.BaseObservable;
//import android.databinding.Bindable;

/**
 * Created by Phil on 2017/8/17.
 */

public class User extends BaseObservable {
    private String id;
    private String name;
    private String blog;

    public void setId(String id) {
        this.id = id;
        //notifyPropertyChanged(BR.id);
    }

    //@Bindable
    public String getId() {
        return this.id;
    }


    public void setName(String name) {
        this.name = name;
        //notifyPropertyChanged(BR.name);
    }

    //@Bindable
    public String getName() {
        return this.name;
    }

    public void setBlog(String blog) {
        this.blog = blog;
        //notifyPropertyChanged(BR.blog);
    }

    //@Bindable
    public String getBlog() {
        return this.blog;
    }
}


(3)因为是一个 RecyclerView,RecyclerView 需要 Adapter,在 Adapter 中需要一个布局 layout,为 User 的数据找到 View,Adapter 需要的子 view 布局这里将写 View 和 Model 的绑定代码,item.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="user"
            type="zhangphil.test.User" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.id}"
            android:textColor="@android:color/holo_red_light" />

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}"
            android:textColor="@android:color/holo_red_light" />

        <TextView
            android:id="@+id/blog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.blog}"
            android:textColor="@android:color/holo_red_light" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="@android:color/holo_blue_bright" />
    </LinearLayout>
</layout>


(4)上层 Java 代码,注意观察 ViewHolder 的写法。比较关键的是在创建 ViewHolder 时候传入的 ViewDataBinding。在 Adapter 的 onBindViewHolder 里面,仅需两行代码就实现数据模型和 View 的绑定,MainActivity.java:
package zhangphil.test;

import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

import static zhangphil.test.BR.user;

public class MainActivity extends AppCompatActivity {
    private int index = 0;

    private ItemAdapter mItemAdapter;
    private ArrayList<User> mItems;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler_view_layout);

        mItems = new ArrayList();
        for (int i = 0; i < 1; i++) {
            User u = new User();
            u.setId(index + "");
            u.setName("zhangphil @" + index);
            u.setBlog("blog.csdn.net/zhangphil @" + index);

            mItems.add(u);

            index++;
        }

        RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

        mItemAdapter = new ItemAdapter();
        mRecyclerView.setAdapter(mItemAdapter);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                User u = new User();
                u.setId(index + "");
                u.setName("zhangphil @" + index);
                u.setBlog("blog.csdn.net/zhangphil @" + index);

                mItems.add(u);
                mItemAdapter.notifyDataSetChanged();

                index++;
            }
        });
    }


    private class ItemAdapter extends RecyclerView.Adapter<ItemViewHolder> {

        @Override
        public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item, viewGroup, false);
            ItemViewHolder holder = new ItemViewHolder(binding);
            return holder;
        }

        @Override
        public void onBindViewHolder(ItemViewHolder viewHolder, int i) {
            viewHolder.getBinding().setVariable(user, mItems.get(i));
            viewHolder.getBinding().executePendingBindings();
        }

        @Override
        public int getItemCount() {
            return mItems.size();
        }
    }

    private class ItemViewHolder extends RecyclerView.ViewHolder {
        private ViewDataBinding binding;

        public ItemViewHolder(ViewDataBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }

        public void setBinding(ViewDataBinding binding) {
            this.binding = binding;
        }

        public ViewDataBinding getBinding() {
            return this.binding;
        }
    }
}


代码运行结果,每点击一次 button,数据增加一个,更新:




附录:
1,《Android 官方 DataBinding 简例(一)》链接:http://blog.csdn.net/zhangphil/article/details/77322530  
2,《Android 官方 DataBinding(二):动态数据更新 notifyPropertyChanged》链接:http://blog.csdn.net/zhangphil/article/details/77328688 

android.databinding.InverseBindingAdapter的实例源码

android.databinding.InverseBindingAdapter的实例源码

项目:DroidMVVMValidator    文件:Bindings.java   
@InverseBindingAdapter(attribute = "android:text",event = "android:textAttrChanged")
public static Integer getIntegerText(TextView view) {
    CharSequence text = view.getText();
    if (text != null && text.length() > 0) {
        return Integer.valueOf(text.toString());
    }
    return null;
}
项目:spline    文件:LayerBindingAdapters.java   
@InverseBindingAdapter(attribute = "android:text")
public static float getText(TextInputEditText dimView) {
    try {
        String dimstring = dimView.getText().toString();
        float dimVal = Float.parseFloat(dimstring);
        return dimVal;
    } catch (NumberFormatException e) {
        // Return 0 for Now
        return 0;
    }
}
项目:Jockey    文件:RecyclerViewBindingAdapters.java   
@InverseBindingAdapter(attribute = "scrollPosition")
public static int getScrollPosition(RecyclerView recyclerView) {
    if (recyclerView.getChildCount() == 0) {
        return 0;
    }

    return recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0));
}
项目:SampleAppArch    文件:SpinnerBindingUtil.java   
@InverseBindingAdapter(attribute = "selectedValue",event = "selectedValueAttrChanged")
public static String captureSelectedValue(AppCompatSpinner pAppCompatSpinner) {
  return (String) pAppCompatSpinner.getSelectedItem();
}
项目:ElephantAsia    文件:SpinnerBindingUtil.java   
@InverseBindingAdapter(attribute = "bind:selectedValue",event = "bind:selectedValueAttrChanged")
public static String captureSelectedValue(Spinner pSpinner) {
  return (String) pSpinner.getSelectedItem();
}
项目:OCast-Java    文件:viewmodel.java   
@InverseBindingAdapter(attribute = "selectedItemPosition")
public Integer getSelectedItemPosition(AppCompatSpinner spinner)
{
    return spinner.getSelectedItemPosition();
}
项目:DataBindingGuide    文件:CustomBindings.java   
@InverseBindingAdapter(attribute = "app:text",event = "android:textAttrChanged")
public static String getTextString(TextView view) {
    return view.getText().toString();
}
项目:android-mvvmFramework    文件:BindingConfig.java   
@InverseBindingAdapter(attribute = "refreshing",event = "refreshingAttrChanged")
public static boolean isRefreshing(SwipeRefreshLayout view) {
    return view.isRefreshing();
}
项目:Jockey    文件:ViewPagerBindingAdapters.java   
@InverseBindingAdapter(attribute = "page")
public static int getPage(ViewPager pager) {
    return pager.getCurrentItem();
}
项目:nethunter-app    文件:MITMFviewmodel.java   
@InverseBindingAdapter(attribute = "android:checked",event = "android:checked")
public static boolean getViewChecked(CheckBox view) {
    return view.isChecked();
}

我们今天的关于Spring中WebDataBinder使用详解spring的web的分享已经告一段落,感谢您的关注,如果您想了解更多关于005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展、3.13、@InitBinder 和 WebDataBinder、Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据、android.databinding.InverseBindingAdapter的实例源码的相关信息,请在本站查询。

本文标签: