使用@Value注释注入类的字段和使用Spring Environment API查找它们之间是否存在任何显着差异?一个优先于另一个(在什么情况下)?
使用@Value的示例:
class Config {
@Value("${db.driverClassName}")
private String driverClassName;
@Value("${db.url}")
private String url;
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
@Bean
public javax.sql.DataSource dataSource(){
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName(driverClassName);
poolProperties.setUrl(url);
poolProperties.setUsername(username);
poolProperties.setPassword(password);
return new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
}
}
Run Code Online (Sandbox Code Playgroud)
使用Environment API的示例:
class Config {
@Autowired
private Environment environment;
@Bean
public javax.sql.DataSource dataSource(){
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName(environment.getProperty("db.driverClassName"));
poolProperties.setUrl(environment.getProperty("db.url"));
poolProperties.setUsername(environment.getProperty("db.username"));
poolProperties.setPassword(environment.getProperty("db.password"));
return new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个简单的Spring Rest Controller和一些验证.我的理解是验证失败会抛出MethodArgumentNotValidException.但是,我的代码抛出了BindException.在调试消息中,我还看到应用程序返回null ModelAndView.
为什么Rest Controller会抛出BindException或返回null ModelAndView?
注意:我正在使用curl测试我的Web应用程序并进行HTTP POST
curl -X POST http://localhost:8080/tasks
Run Code Online (Sandbox Code Playgroud)
我故意省略"name"参数,这是一个标有@NotNull和@NotBlank注释的必填字段.
我的控制器:
@RestController
public class TasksController {
private static Logger logger = Logger.getLogger(TasksController.class);
@Autowired
private MessageSource messageSource;
@Autowired
private Validator validator;
@InitBinder
protected void initBinder(WebDataBinder binder){
binder.setValidator(this.validator);
}
@RequestMapping(value = "/tasks", method = RequestMethod.POST)
public Task createTask(@Valid TasksCommand tasksCommand){
Task task = new Task();
task.setName(tasksCommand.getName());
task.setDue(tasksCommand.getDue());
task.setCategory(tasksCommand.getCategory());
return task;
}
}
Run Code Online (Sandbox Code Playgroud)
我的"命令"类(包含验证注释)
public class TasksCommand {
@NotBlank
@NotNull
private String name;
private Calendar due;
private String category; …Run Code Online (Sandbox Code Playgroud)