2016-05-22 77 views
0

在Spring中,我可以使用一個Principal對象作爲Web控制器方法的參數,並將其填充。例如:在Spring中,如何自動填充web @Controller方法的自定義參數?

public String listTransactionsForAccount(Model model, Principal principal) { 
    String username = principal.getName(); 
    // do something with the username 
} 

我的問題是:我怎麼能傳遞一個自定義對象(Account),並把它填充,類似Spring如何填充Principal

在我的應用程序模型中,我有一個設置,其中存在0..n User s/Account。我可以得到基於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 
} 

我怎麼會去這樣做呢?

+1

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/method/support/HandlerMethodArgumentResolver.html最有可能 –

回答

0

@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); 
} 

} 

只要上述(通過分量掃描,或bean聲明),則Account值的方法中的填充這樣的:

@Controller 
public class TxController { 

public String listTransactionsForAccount(Model model, Account account) { 
    .... 
} 
.... 
} 
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 
     } 

第一種方法是將前一秒被調用,它將填充帳戶變爲模型。這將被注入第二種方法

相關問題