java - 带有泛型的命令对象

标签 java spring spring-mvc

我有一个 Controller ,它有一个使用泛型的命令对象,如下所示:

@Controller
@RequestMapping(value = "/first")
public class MyFirstController {

    @RequestMapping(value = "/something", method = RequestMethod.POST)
    @ResponseBody
    public ADifferentDTO doSomething(RequestDTO<MyStringObject> requestDTO, HttpServletRequest request,
            HttpServletResponse response) {

            requestDTO.getSomeObject(); // ERROR HERE


            //.. do something
    }
}

但是,这不起作用。我假设它不起作用,因为 Java 中的类型删除。有没有办法让命令对象使用泛型? 以下是其他一些类的样子。

public class RequestDTO<T> {

    private T someObject;
    // some other objects here as well that are from a submitted form (not listed)


    public void setSomeObject(T someObject){
        this.someObject = someObject;
    }

    public T getSomeObject(){
        return someObject;
    }
}

public class MyStringObject {
    private String someString;

    public MyStringObject(String someString){
        this.someString = someString;
    }
    // getter and setter
}


public class MyIntegerObject {
    private Integer someInteger;
    private Integer anotherInteger;

    public MyIntegerObject(Integer someInteger, Integer anotherInteger){
        this.someInteger = someInteger;
        this.anotherInteger = anotherInteger;
    }
    // getter and setter
}

我得到的错误:

java.lang.Object 无法转换为 com.test.MyStringObject

当然,如果我将 RequestDTO 更改为仅使用 MyStringObject,它就可以正常工作。

public class RequestDTO {

    private MyStringObject someObject;
    // some other objects here as well that are from a submitted form (not listed)


    public void setSomeObject(MyStringObject someObject){
        this.someObject = someObject;
    }

    public MyStringObject getSomeObject(){
        return someObject;
    }
}

有办法做到这一点吗?

最佳答案

你是对的,这是因为类型删除。

可能最简单的解决方案是创建一个使用每个 My*Object 进行参数化的 RequestDTO 子类,并将其用作命令对象类。

给出你的例子:

@SpringBootApplication
public class So44423504Application {

    public static void main(String[] args) {
        SpringApplication.run(So44423504Application.class, args);
    }

    @RestController
    @RequestMapping(value = "/first")
    public static class MyFirstController {

        public static class MyStringRequestDTO extends RequestDTO<MyStringObject> {}

        public static class MyIntegerRequestDTO extends RequestDTO<MyIntegerObject> {}

        @PostMapping(value = "/something")
        public String doSomething(@ModelAttribute MyStringRequestDTO/*MyIntegerRequestDTO*/ requestDTO) throws JsonProcessingException {
            return new ObjectMapper().writeValueAsString(requestDTO);
        }
    }

    public static class RequestDTO<T> {
        private T someObject;
        // getter and setter
    }

    public static class MyStringObject {
        private String someString;

        public MyStringObject() { } // required since another non-default ctor is present.

        public MyStringObject(String someString){
            this.someString = someString;
        }

        // getter and setter
    }

    public static class MyIntegerObject {
        private Integer someInteger;
        private Integer anotherInteger;

        public MyIntegerObject() { } // required since another non-default ctor is present.

        public MyIntegerObject(Integer someInteger, Integer anotherInteger){
            this.someInteger = someInteger;
            this.anotherInteger = anotherInteger;
        }
        // getters and setters
    }
}

然后就可以正常工作了:

$ curl -XPOST 'localhost:8080/first/something?someObject.someInteger=23&someObject.anotherInteger=42'
{"someObject":{"someInteger":23,"anotherInteger":42}}%

$ curl -XPOST 'localhost:8080/first/something?someObject.someString=test'                            
{"someObject":{"someString":"test"}}%

关于java - 带有泛型的命令对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44423504/

相关文章:

Spring MVC 在 intellij idea 10 中不起作用

java - JUnit&Mockito : how to inject field values to Spring component?

spring - 如何在 Spring Web App 中临时禁用 Spring Security

java - 约束布局admob问题

java - 使用 AWS SDK for Java 版本 2 进行 SNS 验证

java - 在基于 Java 的 spring 配置层次结构中覆盖 bean

java - 对于没有 WEB-INF 目录的 Maven/Java 项目,将 Spring 上下文文件放在哪里?

java - libGDX 中的视频播放

java - 如何使用 java netbeans 更新 MS Access 表中的特定行?

spring - 如何使 Intellij Idea "Spring Dependencies Diagram"仅显示 bean 的一个子集?