Java 在Spring中,如何将自定义参数自动填充到web@Controller方法?
在Spring中,我可以使用Java 在Spring中,如何将自定义参数自动填充到web@Controller方法?,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,在Spring中,我可以使用Principal对象作为web控制器方法的参数,并填充它。例如: public String listTransactionsForAccount(Model model, Principal principal) { String username = principal.getName(); // do something with the username } 我的问题是:如何传入自定义对象(Account)并使其填充,类似于Spring填充
Principal
对象作为web控制器方法的参数,并填充它。例如:
public String listTransactionsForAccount(Model model, Principal principal) {
String username = principal.getName();
// do something with the username
}
我的问题是:如何传入自定义对象(Account
)并使其填充,类似于Spring填充主体的方式
在我的应用程序模型中,我有一个设置,其中每个帐户有0..n用户
s。我可以从主体
中获取用户,但我真正想要的是帐户
。我发现我必须在很多地方这样做:
String username = principal.getName();
User user = userService.findByUsername(username);
Long accountId = user.getAccount().getId();
如果我能做到这一点,那就太理想了:
public String listTransactionsForAccount(Model model, Account account) {
// do stuff directly with the account
}
我该怎么做呢?@RC是对的。。。(将此作为答案发布,我会接受)
我所做的如下:
@Component
public class AccountHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private UserService userService;
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mvContainer,
NativeWebRequest request, WebDataBinderFactory webDataBinderFactory) throws Exception {
Account account = null;
Principal principal = request.getUserPrincipal();
if (principal != null) {
String email = principal.getName();
User user = userService.findByEmail(email);
if (user != null) {
account = user.getAccount();
}
}
return account;
}
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(Account.class);
}
}
只要spring选择上面的类(通过组件扫描或bean声明),就会用如下方法填充Account
值:
@Controller
public class TxController {
public String listTransactionsForAccount(Model model, Account account) {
....
}
....
}
@RC是对的。。。(将此作为答案发布,我会接受)
我所做的如下:
@Component
public class AccountHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private UserService userService;
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer mvContainer,
NativeWebRequest request, WebDataBinderFactory webDataBinderFactory) throws Exception {
Account account = null;
Principal principal = request.getUserPrincipal();
if (principal != null) {
String email = principal.getName();
User user = userService.findByEmail(email);
if (user != null) {
account = user.getAccount();
}
}
return account;
}
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().equals(Account.class);
}
}
只要spring选择上面的类(通过组件扫描或bean声明),就会用如下方法填充Account
值:
@Controller
public class TxController {
public String listTransactionsForAccount(Model model, Account account) {
....
}
....
}
您可以使用@ModelAttribute参数和方法
下面是实现它的一种方法
public class AController {
@Autowired
private Object someBean;
@ModelAttribute
public void setAccount(Model model)
{
model.addAttrbute("account", new Account());
//you can use some injected object to retrieve account object
//ex someBean.getAccountFactory().getInstance();
}
@RequestMapping
public Strig yourMethod (@ModelAttribute("account") Account ac,Model model {
///your code
}
第一个方法将在第二个方法之前调用,它将把Account填充到模型中。这将被注入到第二个方法中您可以使用@modeldattribute参数和方法
下面是实现它的一种方法
public class AController {
@Autowired
private Object someBean;
@ModelAttribute
public void setAccount(Model model)
{
model.addAttrbute("account", new Account());
//you can use some injected object to retrieve account object
//ex someBean.getAccountFactory().getInstance();
}
@RequestMapping
public Strig yourMethod (@ModelAttribute("account") Account ac,Model model {
///your code
}
第一个方法将在第二个方法之前调用,它将把Account填充到模型中。这很可能会被注入第二种方法