Java 自动关联集合
你们中的大多数人可能会说,我应该使用谷歌来解决这个问题,因为它非常简单,但我找不到一个真正正确的解决方案 我有两种会话范围模型:Java 自动关联集合,java,spring,annotations,autowired,Java,Spring,Annotations,Autowired,你们中的大多数人可能会说,我应该使用谷歌来解决这个问题,因为它非常简单,但我找不到一个真正正确的解决方案 我有两种会话范围模型:播放列表和曲目。正如您所猜测的,播放列表包含曲目列表: @Component public class Playlist { String name; List<Track> tracklist; @Component public class Track { int duration; String artist; 似乎
播放列表
和曲目
。正如您所猜测的,播放列表包含曲目列表:
@Component
public class Playlist {
String name;
List<Track> tracklist;
@Component
public class Track {
int duration;
String artist;
似乎不起作用。
在我的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>
但并没有帮助我,因为轨迹不是通过.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;
}
现在,我解决了从轨迹中删除@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;
}
公共列表GetPlayFromFile(多部分文件){
List tracklist=new ArrayList();
//在这里做点什么。。。
返回跟踪列表;
}
这样行得通。如果您认为我没有说到点子上,请告诉我。我看不到将track声明为会话范围bean的意义。您在会话中不存储一首曲目,而是存储一个播放列表。因此,每次需要曲目列表时,只需从会话中获取播放列表,并在列表中迭代。列表为空,因为您从未初始化它。初始化它为
new ArrayList()
,因为它最初可能是空的。显然,在第一个控制器中,我初始化列表并填充它。但是当我试图从另一个控制器(在调用第一个控制器之后)获取它时,列表只包含一个所有字段都为空的轨迹。这似乎很奇怪,删除轨道上的@Resource注释,而不将轨道配置为组件。并向我们展示您的代码。如果这对您有效,请将您自己的答案标记为答案,否则问题将保持开放状态
playlist.setTracks(service.getListOfTrackFromFile(file));
public List<Track> getPlaylistFromFile(MultipartFile file) {
List<Track> tracklist = new ArrayList<Track>();
//do something here...
return tracklist;
}