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

时间:2016-05-22 18:42:39

标签: 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的方式?

在我的应用程序模型中,我已经设置了每User有0..n Account s的设置。我可以根据Principal获取用户,但我真正关注的是Account。我发现我必须在很多地方这样做:

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
}

我将如何做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用@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填充到模型中。这将被注入第二种方法

答案 1 :(得分:0)

@RC是对的......(作为答案发布,我会接受它)

我所做的如下:

@Controller
public class TxController {

public String listTransactionsForAccount(Model model, Account account) {
    ....
}
....
}

只要spring选择上面的类(通过组件扫描或bean声明),就会在这样的方法中填充 var locations = []; 值:

public partial class threat
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int threat_id { get; set; }
    public int category_id { get; set; }
    public double lat { get; set; }
    public double lng { get; set; }
}