Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring中,如何将自定义参数自动填充到web@Controller方法?_Java_Spring_Spring Mvc_Spring Security - Fatal编程技术网

Java 在Spring中,如何将自定义参数自动填充到web@Controller方法?

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填充

在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填充到模型中。这很可能会被注入第二种方法