首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring-MVC @ModelAttribute和@Autowired

Spring-MVC @ModelAttribute和@Autowired
EN

Stack Overflow用户
提问于 2013-09-14 10:48:10
回答 3查看 1.7K关注 0票数 1

我正在尝试使用方法上的@ModelAttribute an初始化一个对象。当调用URL "/p/PPP/scope“时,会发生奇怪的事情。在调用@ModelAttribute方法时,ProjectService似乎没有被实例化,但是在调用show()方法时它就在那里。有谁知道这里面有什么不对吗?

以下是日志语句:

代码语言:javascript
复制
12:32:19 [DEBUG] ScopeController - getProject() - loading project for 'PPP'
12:32:19 [DEBUG] ScopeController - getProject() - projectService initialized? null
12:32:21 [DEBUG] ScopeController - show() - projectService initialized? ...project.ProjectService@20f2442e

来文提交人:

代码语言:javascript
复制
@Controller
@RequestMapping("/p/{abbr}/scope")
@SessionAttributes("project")
public class ScopeController {

    public static final String SHOW_PROJECT_PAGE = "/projects/scope/show";

    private static final Logger log = LoggerFactory.getLogger(ScopeController.class);

    @Autowired
    private ProjectService projectService;

    @ModelAttribute("project")
    private Project getProject(@PathVariable(value = "abbr") String abbr) {
        log.debug("getProject() - loading project for '{}'", abbr);
        log.debug("getProject() - projectService initialized? {}", projectService);
        // should call this method:
        // return projectService.find(abbr);
        return new Project();
    }

    @RequestMapping(method = RequestMethod.GET)
    @Transactional
    public String show() throws BindException {
        log.debug("show() - projectService initialized? {}", projectService);
        return SHOW_PROJECT_PAGE;
    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-04-24 15:17:02

所有带有ModelAttibute注释的方法都必须是公共的.

因此,当方法getProject是公共的-它将正常工作:

代码语言:javascript
复制
 @ModelAttribute("project")
 public Project getProject( ...
票数 1
EN

Stack Overflow用户

发布于 2013-09-14 12:37:45

也许尝试几件事。

  1. 更改:的签名
    • 私有项目getProject到
    • public @ResponseBody项目

  1. 从控制器中删除@Transactional,并将它们移动到任何需要它们的服务方法中。(可以说是更好的设计实践-怀疑它是否导致了您所描述的问题)
  2. 将@ModelAttribute(" Project ")注释移动到项目类
    • 即 @ModelAttribute(" Project ")公共项目get Project(){返回新项目();}

所以它看起来就像:

代码语言:javascript
复制
@Controller
@RequestMapping("/p/{abbr}/scope")
@SessionAttributes("project")
public class ScopeController {

public static final String SHOW_PROJECT_PAGE = "/projects/scope/show";

private static final Logger log = LoggerFactory.getLogger(ScopeController.class);

@Autowired
private ProjectService projectService;

@RequestMapping(value = "/<yourUri for getProject>", method = RequestMethod.GET)
public @ResponseBody Project get(@PathVariable(value = "abbr") String abbr) {
    return getProject(abbr);
}

private Project getProject(String abbr) {
    log.debug("getProject() - loading project for '{}'", abbr);
    log.debug("getProject() - projectService initialized? {}", projectService);
    // should call this method:
    // return projectService.find(abbr);
    return new Project();
}

@RequestMapping(method = RequestMethod.GET)
@Transactional
public String show() throws BindException {
    log.debug("show() - projectService initialized? {}", projectService);
    return SHOW_PROJECT_PAGE;
}

}

代码语言:javascript
复制
//In your Project class 
@ModelAttribute("project")
public class Project {
//your class stuff
}
票数 0
EN

Stack Overflow用户

发布于 2013-09-14 13:24:01

首先,我会将@Transactional注释放在存储/数据访问层,因为这是良好的分层Spring注释应用程序的规范。此外,您的@PathVariable注释用于检索控制器基本URI之后在URI中传递的值。因此,在不拦截URI模式的私有助手方法中使用该注释没有什么意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18800954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档