Spring,Java:将通用对象列表作为返回类型传递

时间:2015-06-16 12:46:56

标签: java spring spring-mvc generics casting

我正在开发一个Spring-MVC应用程序,根据用户设置的模式,我必须返回一个Object1或Object2的List。理想情况下,我可以创建两个控制器方法并适当地发送List,但我想知道是否有任何方法,我可以在该Controller方法中发送任何类型的List。

控制器方法:

@PreAuthorize("hasRole('ROLE_USER')")
@RequestMapping(value = "/findnotebydays/{days}/{canvasid}/{mode}")
public @ResponseBody List<Inotes> findNotesByDays(@PathVariable("days")int days, @PathVariable("canvasid")int canvasid,
                                                  @PathVariable("mode")boolean mode ){

    if(!mode){
        return this.groupNotesService.findGroupNotesByDays(days,canvasid);
    } else {
        return this.notesService.findNotesByDays(days,canvasid);
    }
}

基本上,如果mode为false,我想返回List<GroupNotes>,如果mode为true,我想返回List<Notes>。我认为我的天真方法可以说它是一个对象并返回,但似乎没有用。请告诉我我能做些什么。非常感谢。 : - )

更新

GroupNotes模型类:

@Entity
@Table(name="groupnotes")
public class GroupNotes implements Inotes{

  @Id
    @Column(name="mnoteid")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "mnote_gen")
    @SequenceGenerator(name = "mnote_gen",sequenceName = "mnote_seq")
    @org.hibernate.annotations.Index(name = "mnoticesidindex")
    private int mnoticesid;

    @Column(name = "mnotetext")
    private String mnotetext;
//Other variables, getters, setters ignored
}

Notes模型类:

@Entity
@Table(name="note")
public class Notes implements Inotes{

    @Id
    @Column(name="noteid")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "note_gen")
    @SequenceGenerator(name = "note_gen",sequenceName = "note_seq")
    @org.hibernate.annotations.Index(name = "noteidindex")
    private int noticesid;

    @Column(name = "notetext")
    private String notetext;
//Other variables, getters, setters ignored
}

接口信息:

package com.journaldev.spring.model;


public interface Inotes {
}

3 个答案:

答案 0 :(得分:4)

遵循干净的编码器样式,如果必须将布尔值传递给方法,那么该方法实际上会做两件事,并且您希望方法只做一件事。

我只会做两个控制器操作,稍后用户和代码的维护者会更清楚。

答案 1 :(得分:2)

您应该使用两个类共享的公共接口。

声明一个接口,例如:

public interface INotes{

}

public class GroupNotes implements INotes{...}

public class Notes implements INotes{...}

您的代码将变为:

@PreAuthorize("hasRole('ROLE_USER')")
@RequestMapping(value = "/findnotebydays/{days}/{canvasid}/{mode}")
public @ResponseBody List<INotes> findNotesByDays(@PathVariable("days")int days, @PathVariable("canvasid")int canvasid,
                                                  @PathVariable("mode")boolean mode ){

    if(!mode){
        return  this.groupNotesService.findGroupNotesByDays(days,canvasid);
    } else {
        return this.notesService.findNotesByDays(days,canvasid);
    }
}

另一个更简单的解决方案是返回List(或List<?>以获得合规性),但这种做法更为合适。

答案 2 :(得分:1)

考虑到NotesGroupNotes都在实现Note界面(例如),您可以随时返回List<Note>