自动收集一个集合

时间:2012-02-04 11:57:21

标签: java spring annotations autowired

大多数人可能会说我应该使用谷歌来解决这个问题,因为它很简单,但我找不到真正正确的解决方案。

我有两个会话范围的模型:PlaylistTrack。您可以猜到,播放列表包含一个曲目列表:

@Component
public class Playlist {
    String name;
    List<Track> tracklist;

@Component
public class Track {
    int duration;
    String artist;

我在控制器中使用@Autowired注释来获取播放列表。在第一个控制器中,我设置了播放列表的属性,在第二个控制器中,我得到了它们。使用播放列表的name属性,一切正常,但tracklist为空。我知道我必须使用类似@Resource@Qualifier的内容,但我不明白如何使这个注释有效。只需写作

@Resource
private List<Track> tracks; 

似乎不起作用。 在我的servlet-context.xml中,这两个bean被声明为:

<bean id="track" class="com.foo.bar.models.Track" scope="session">
    <aop:scoped-proxy/>
</bean>

<bean id="playlist" class="com.foo.bar.models.Playlist" scope="session">
    <aop:scoped-proxy/>
</bean>

我已经看过这个Spring autowire a list,但没有帮助我,因为曲目不是通过.xml声明,而是在控制器中设置。

1 个答案:

答案 0 :(得分:0)

问题解决了。我认为我的错误是覆盖了控制器中的自动装配的播放列表,并且从服务中传递了非自动装配的播放列表。

控制器代码是:

@Autowired
private Playlist playlist;
@Autowired
private MyService service;

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView uploadAndParse(@RequestParam("file") MultipartFile file) {
    String name = file.getOriginalFilename();

    playlist = service.getPlaylistFromFile(file); //<--wrong step
    playlist.setCompleteName(name);

    ModelAndView view = new ModelAndView("upload", "list", playlist.getTracks());

    return view;
}

服务是:

public Playlist getPlaylistFromFile(MultipartFile file) {
    Playlist playlist = new Playlist();
    //do something here...
    return playlist;
 }

现在,我解决了从Track中删除@Component注释(如JB Nizet建议的那样),修改控制器如下:

playlist.setTracks(service.getListOfTrackFromFile(file));

和服务如下:

public List<Track> getPlaylistFromFile(MultipartFile file) {
    List<Track> tracklist = new ArrayList<Track>();
    //do something here...
    return tracklist;
 }

喜欢这个作品。如果您认为我没有达到目的,请告诉我。