在SpringBoot中,在转换之前将查询参数绑定到中间Java对象

时间:2016-11-08 15:27:16

标签: java spring spring-mvc spring-boot

我目前正在使用SpringBoot 1.3.5来处理Web表单提交。

我想让我的控制器处理程序为特定请求提供一个Java对象,该对象经历了以下步骤:

  • 将查询参数绑定到Java对象
  • 验证此数据
  • 丰富了这个经过验证的数据 - 基本上将绑定对象转换为另一种具有附加数据的类型。

目的是允许我将各种逻辑位保留在特定位置,使其更清晰,更易测试,并且具有代表表单提交的单独类型以及我正在我的应用程序中处理的域对象。 / p>

我能做什么:

  • 我可以让Spring将各种请求参数绑定到一个将那些命名参数作为字段的bean。

  • 通过使用实现Converter接口的转换器,我可以自动转换Spring。

然而,我无法按照自己的意愿开展工作;当转换器的源和目标类型相同时,我只能调用转换器。作为处理请求的第一步,我可以注入一个ConversionService并手动执行转换,但是可能有一个更好的解决方案可以自动完成吗?

所以我有:

public class FooRequest {
    @Valid private List<Bar> bars;
    @Size(min = 10, max = 10) private String requestCode;

    private EnrichedData enrichedData;
}

@Controller
public class MyController {
    @RequestMapping(value = "/test", method = POST)
    public String test(@Valid FooRequest request, BindingResult bindingResult, Model model) {
        FooRequest enrichedRequest = enrich(request);
        // do some stuff....
        return "test";
    }
}

也许这个测试有助于澄清意图:

@Test public void () throws Exception {
    mvc.perform(
            post("/test")
                    .session(createSession())
                    .param("requestCode", "42")
                    .param("bar[0].a", "123")
                    .param("bar[0].b", "456"));
    .... 
}

然后我将浓缩转移到我的AppConfig中注册的转换器(扩展了Spring的WebMvcConfigurerAdapter):

@Controller
public class MyController {
    @RequestMapping(value = "/test", method = POST)
    public String test(@Valid FooRequest request, BindingResult bindingResult, Model model) {
        // do some stuff....
        return "test";
    }
}

public class FooConverter  implements Converter<FooRequest, FooRequest> {
    @Override public FooRequest convert(final FooRequest foo) {
        // do some stuff and create a request from the form
        ....
        return enriched(foo)
    }
}

我想要的是引入FooForm类型的能力,以便我最终得到这个:

@Controller
public class MyController {
    @RequestMapping(value = "/test", method = POST)
    public String test(@Valid FooRequest request, BindingResult bindingResult, Model model) {
        // do some stuff....
        return "test";
    }
}

public class FooConverter  implements Converter<FooForm, FooRequest> {
    @Override public FooRequest convert(final FooForm form) {
        // do some stuff and create a request from the form
        ....
        return convertIntoRequest(form)
    }
}

public class FooForm {
    @Valid private List<Bar> bars;
    @Size(min = 10, max = 10) private String requestCode;
}

public class FooRequest {
    private List<Bar> bars;
    private String requestCode;

    private EnrichedData enrichedData;

}

思想?

0 个答案:

没有答案