我有一个 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/