java - (无)参数构造函数的最佳方法 - ResponseBody - Spring

标签 java spring

让我介绍一下我的代码,然后我会问一个问题。 这只是一个例子。如果可能的话,我想学习一些新东西。

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

  }
}

Detailed example

关于java - (无)参数构造函数的最佳方法 - ResponseBody - Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51600397/

相关文章:

java - 适用于 Java 的 Azure Blob 存储客户端库

Java服务器: Socket sending HTML code to browser

java - Class.forName() 方法对 JDBC 有什么作用?

java - 签名 PADES 顺序或并行

Spring OAuth : Custom form for authenticating authorization endpoint

java - 如果线程在执行过程中中断 Spring 事务模板,是否可以保证回滚?

java - spring jpa中根据实体从多个表中获取数据

java - 将 Spock 与 Jenkins、Sonar 集成的最佳实践

java - Mock beans 与 Mockito 的 Spring Boot 单元测试

java - 无法获取 json : Infinite recursion