你们中的大多数人可能会说我应该使用google来解决这个问题,因为它很简单,但是我找不到真正有效的解决方案。

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

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

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


我在控制器中使用@Autowired批注获取播放列表。在第一个控制器中,我设置播放列表的属性,在第二个控制器中,我获取它们。播放列表的name属性一切正常,但tracklist为null。我知道我必须使用@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声明的,而是在控制器中设置的。

最佳答案

问题解决了。我认为我的错误是用从服务传递的非自动连线的播放器覆盖了控制器中的自动连线的播放列表。

控制器代码为:

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


像这样的作品。如果您认为我没有解决问题,请告诉我。

10-08 15:26