让我介绍一下我的代码,然后我会问一个问题。 这只是一个例子。如果可能的话,我想学习一些新东西。
BaseClass.java
public class BaseClass {
private String baseName;
BaseClass(String baseName){
this.baseName = baseName;
}
//getters and setters
}
MyClass.java
public class MyClass extends BaseClass {
private boolean isTest;
private String name;
MyClass(){
}
MyClass(String baseName){
super(baseName);
this.isTest = true;
}
//getters and setters
}
MyClassController.java
@Controller
public class MyClassController {
@GetMapping(value="/")
@ResponseBody
public String myClassController(@RequestBody MyClass myClass) {
return "index";
}
}
JSON 请求:
{
"name": "Name for BaseClass"
}
因此,我发送名称,例如:BaseClass 的名称。我想通过构造函数为 BaseClass 中的变量 BaseName 设置此名称。 @RequestBody 不需要属性构造函数,所以我不能在那里使用第二个带有参数的构造函数。我可以处理这个例如使用附加方法:
MyClass.java 中的附加方法
public MyClass setValues(String baseName){
super(baseName);
this.isTest = true;
return this;
}
新的 MyController.java
@Controller
public class MyClassController {
@GetMapping(value="/")
@ResponseBody
public String myClassController(@RequestBody MyClass myClass) {
myClass.setValues(myClass.getName());
//more uses for myClass
return "index";
}
}
有没有更好的方法以更“专业”的方式做这样的事情?
最佳答案
如果您已经习惯了当前的继承结构,则可以使用 HttpMessageConverter 来自定义 Spring 反序列化 HTTP 请求的方式。
public class MyClassConverter extends AbstractHttpMessageConverter<MyClass> {
public MyClassConverter() {
super(new MediaType("text", "myClass"));
}
@Override
protected boolean supports(Class<?> clazz) {
return MyClass.class.isAssignableFrom(clazz);
}
@Override
protected MyClass readInternal(Class<? extends MyClass> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
// Deserialize JSON request
MyClass inputObject = new MyClass(name);
return inputObject;
}
@Override
protected void writeInternal(MyClass myClass, HttpOutputMessage outputMessage) {
// Serialize MyClass object
}
}
关于java - (无)参数构造函数的最佳方法 - ResponseBody - Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51600397/