完善一些例子
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooController.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooController.java
index c69a8aa..56e64f7 100644
--- a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooController.java
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooController.java
@@ -1,9 +1,10 @@
 package com.supwisdom.leaveschool.foo.controller;
 
 import com.supwisdom.infras.lang.random.RandomGenerator;
-import com.supwisdom.leaveschool.foo.model.BarException;
+import com.supwisdom.leaveschool.foo.dto.FooPostCommand;
+import com.supwisdom.leaveschool.foo.exception.BarException;
 import com.supwisdom.leaveschool.foo.model.Foo;
-import com.supwisdom.leaveschool.foo.model.FooException;
+import com.supwisdom.leaveschool.foo.exception.FooException;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -40,7 +41,7 @@
    * @return
    */
   @PostMapping(path = "/model")
-  public String model(@Valid @ModelAttribute Foo foo) {
+  public String model(@Valid @ModelAttribute FooPostCommand foo) {
     return "foo/model";
   }
 
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooRestController.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooRestController.java
index b5b8911..c1e3732 100644
--- a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooRestController.java
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/controller/FooRestController.java
@@ -1,9 +1,14 @@
 package com.supwisdom.leaveschool.foo.controller;
 
 import com.supwisdom.infras.lang.random.RandomGenerator;
-import com.supwisdom.leaveschool.foo.model.BarException;
-import com.supwisdom.leaveschool.foo.model.Foo;
-import com.supwisdom.leaveschool.foo.model.FooException;
+import com.supwisdom.infras.objectmapper.ObjectMapper;
+import com.supwisdom.leaveschool.foo.dto.FooDto;
+import com.supwisdom.leaveschool.foo.dto.FooPostCommand;
+import com.supwisdom.leaveschool.foo.dto.Page;
+import com.supwisdom.leaveschool.foo.exception.BarException;
+import com.supwisdom.leaveschool.foo.exception.FooException;
+import com.supwisdom.leaveschool.foo.repo.FooRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.util.MimeTypeUtils;
 import org.springframework.web.bind.annotation.*;
@@ -13,13 +18,18 @@
 import java.util.HashMap;
 import java.util.Map;
 
-/**
- * curl -H 'Accept:application/json' 'http://localhost:8080/foo-rest/greeting/abc'
- */
+import static java.util.stream.Collectors.toList;
+
 @RestController
 @RequestMapping("/foo-rest")
 public class FooRestController {
 
+  @Autowired
+  private FooRepository fooRepository;
+
+  @Autowired
+  private ObjectMapper objectMapper;
+
   /**
    * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:8080/foo-rest/greeting/abc'
    *
@@ -35,28 +45,29 @@
 
   /**
    * good请求:
-   * curl -i -s -X POST -H 'Accept=application/json' 'http://localhost:8080/foo-rest/model?name=abc&age=1'
-   *
+   * curl -i -s -X POST -H 'Accept:application/json' 'http://localhost:8080/foo-rest/model?name=abc&age=1'
    * bad请求:
-   * curl -i -s -X POST -H 'Accept=application/json' 'http://localhost:8080/foo-rest/model?name=abc&age=-1'
+   * curl -i -s -X POST -H 'Accept:application/json' 'http://localhost:8080/foo-rest/model?name=abc&age=-1'
    *
    * @param foo
    * @return
    */
   @PostMapping(path = "/model", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
-  public Foo model(@Valid Foo foo) {
+  public FooPostCommand model(@Valid FooPostCommand foo) {
     return foo;
   }
 
   /**
-   * curl -i -s -X GET -H 'Accept=application/json' 'http://localhost:8080/foo-rest/foo-exception?with-message=1'
-   * curl -i -s -X GET -H 'Accept=application/json' 'http://localhost:8080/foo-rest/foo-exception?with-message=0'
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:8080/foo-rest/foo-exception?with-message=1'
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:8080/foo-rest/foo-exception?with-message=0'
    *
    * @return
    * @throws FooException
    */
   @GetMapping(path = "/foo-exception", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
-  public Map<String, Object> exception1(@RequestParam(value = "with-message", required = false, defaultValue = "false") boolean withMessage) throws FooException {
+  public Map<String, Object> exception1(
+      @RequestParam(value = "with-message", required = false, defaultValue = "false") boolean withMessage)
+      throws FooException {
     if (withMessage) {
       throw new FooException(RandomGenerator.randomStringAlphabetic(10));
     } else {
@@ -66,7 +77,7 @@
   }
 
   /**
-   * curl -i -s -X GET -H 'Accept=application/json' 'http://localhost:8080/foo-rest/bar-exception'
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:8080/foo-rest/bar-exception'
    *
    * @return
    */
@@ -79,4 +90,17 @@
     }
   }
 
+  /**
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:8080/foo-rest/all'
+   *
+   * @return
+   */
+  @GetMapping(path = "/all", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
+  public Page getAll() throws FooException {
+    return new Page(fooRepository.getAll()
+        .stream()
+        .map(f -> objectMapper.map(f, FooDto.class))
+        .collect(toList())
+    );
+  }
 }
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/Dto.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/Dto.java
new file mode 100644
index 0000000..bc8ca75
--- /dev/null
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/Dto.java
@@ -0,0 +1,6 @@
+package com.supwisdom.leaveschool.foo.dto;
+
+import java.io.Serializable;
+
+public interface Dto extends Serializable {
+}
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/FooDto.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/FooDto.java
new file mode 100644
index 0000000..7bdadb6
--- /dev/null
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/FooDto.java
@@ -0,0 +1,23 @@
+package com.supwisdom.leaveschool.foo.dto;
+
+public class FooDto implements Dto {
+
+  private String name;
+  private int age;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public int getAge() {
+    return age;
+  }
+
+  public void setAge(int age) {
+    this.age = age;
+  }
+}
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/FooPostCommand.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/FooPostCommand.java
new file mode 100644
index 0000000..cbef7b4
--- /dev/null
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/FooPostCommand.java
@@ -0,0 +1,31 @@
+package com.supwisdom.leaveschool.foo.dto;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+public class FooPostCommand implements Dto {
+
+  @NotNull
+  @NotEmpty
+  private String name;
+
+  @Min(0)
+  private int age;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public int getAge() {
+    return age;
+  }
+
+  public void setAge(int age) {
+    this.age = age;
+  }
+}
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/Page.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/Page.java
new file mode 100644
index 0000000..3cc46f9
--- /dev/null
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/dto/Page.java
@@ -0,0 +1,16 @@
+package com.supwisdom.leaveschool.foo.dto;
+
+import java.util.List;
+
+public class Page implements Dto {
+
+  private List<? extends Dto> data;
+
+  public Page(List<? extends Dto> data) {
+    this.data = data;
+  }
+
+  public List<? extends Dto> getData() {
+    return data;
+  }
+}
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/BarException.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/exception/BarException.java
similarity index 90%
rename from samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/BarException.java
rename to samples/foo/src/main/java/com/supwisdom/leaveschool/foo/exception/BarException.java
index e5b18a1..9aa3b3c 100644
--- a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/BarException.java
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/exception/BarException.java
@@ -1,4 +1,4 @@
-package com.supwisdom.leaveschool.foo.model;
+package com.supwisdom.leaveschool.foo.exception;
 
 public class BarException extends Exception {
   public BarException() {
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/FooException.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/exception/FooException.java
similarity index 89%
rename from samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/FooException.java
rename to samples/foo/src/main/java/com/supwisdom/leaveschool/foo/exception/FooException.java
index 1b319af..4d4f08d 100644
--- a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/FooException.java
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/exception/FooException.java
@@ -1,4 +1,4 @@
-package com.supwisdom.leaveschool.foo.model;
+package com.supwisdom.leaveschool.foo.exception;
 
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ResponseStatus;
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/Foo.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/Foo.java
index f86f7f2..5d4e0e0 100644
--- a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/Foo.java
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/model/Foo.java
@@ -1,16 +1,9 @@
 package com.supwisdom.leaveschool.foo.model;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
 public class Foo {
 
-  @NotNull
-  @NotEmpty
   private String name;
 
-  @Min(0)
   private int age;
 
   public String getName() {
@@ -28,4 +21,9 @@
   public void setAge(int age) {
     this.age = age;
   }
+
+  public Foo(String name, int age) {
+    this.name = name;
+    this.age = age;
+  }
 }
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/repo/FooRepository.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/repo/FooRepository.java
new file mode 100644
index 0000000..5293ecf
--- /dev/null
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/repo/FooRepository.java
@@ -0,0 +1,11 @@
+package com.supwisdom.leaveschool.foo.repo;
+
+import com.supwisdom.leaveschool.foo.exception.FooException;
+import com.supwisdom.leaveschool.foo.model.Foo;
+
+import java.util.List;
+
+public interface FooRepository {
+
+  public List<Foo> getAll() throws FooException;
+}
diff --git a/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/repo/FooRepositoryImpl.java b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/repo/FooRepositoryImpl.java
new file mode 100644
index 0000000..dc174e0
--- /dev/null
+++ b/samples/foo/src/main/java/com/supwisdom/leaveschool/foo/repo/FooRepositoryImpl.java
@@ -0,0 +1,18 @@
+package com.supwisdom.leaveschool.foo.repo;
+
+import com.supwisdom.leaveschool.foo.exception.FooException;
+import com.supwisdom.leaveschool.foo.model.Foo;
+import org.springframework.stereotype.Repository;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Repository
+public class FooRepositoryImpl implements FooRepository {
+
+  @Override
+  public List<Foo> getAll() throws FooException {
+    throw new FooException();
+//    return Arrays.asList(new Foo("xiehuibing", 18), new Foo("chenbo", 18), new Foo("liuhongqing", 18));
+  }
+}
diff --git a/samples/foo/src/main/resources/META-INF/spring-configuration-metadata.json b/samples/foo/src/main/resources/META-INF/spring-configuration-metadata.json
deleted file mode 100644
index 1013fc1..0000000
--- a/samples/foo/src/main/resources/META-INF/spring-configuration-metadata.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "groups": [
-    {
-      "sourceType": "com.supwisdom.leaveschool.foo.mvc.ExceptionErrorProperties",
-      "name": "exception.error-map",
-      "type": "java.util.Map",
-      "description": "Exception class -> error string的映射"
-    }
-  ]
-}
diff --git a/samples/foo/src/main/resources/application.yaml b/samples/foo/src/main/resources/application.yaml
index b223a45..a2938f6 100644
--- a/samples/foo/src/main/resources/application.yaml
+++ b/samples/foo/src/main/resources/application.yaml
@@ -1,6 +1,8 @@
 spring:
   application:
     name: sample-foo
+  mvc:
+    log-resolved-exception: true
 
 infras:
   mvc: