有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

控制器方法:

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

接口Inotes:

package com.journaldev.spring.model;


public interface Inotes {
}

共 (3) 个答案

  1. # 1 楼答案

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

    声明一个接口,例如:

    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. # 2 楼答案

    考虑到NotesGroupNotes都在实现Note接口(例如),您可以始终返回List<Note>

  3. # 3 楼答案

    遵循干净的编码器风格,如果必须将布尔值传递给一个方法,该方法实际上执行两种不同的操作,而您希望一个方法只执行一种操作

    我只需要做两个控制器操作,这对用户和代码的维护人员以后会更清楚