有 Java 编程相关的问题?

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

java是(无)参数构造函数ResponseBy Spring的最佳方式

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

基类。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"
}

因此,我发送name例如:基类的name。我想通过构造函数为基类中的变量BaseName设置此名称@RequestBody不需要atribute构造函数,因此我不能在那里使用带参数的第二个构造函数。我可以处理这个问题,例如使用其他方法:

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";
  }
}

有没有更好的方法以更“专业”的方式做类似的事情


共 (2) 个答案

  1. # 1 楼答案

    如果您使用的是当前的继承结构,那么可以使用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

  2. # 2 楼答案

    虽然不清楚,但我假设name和baseName是相同的值。在这种情况下,基类是抽象类或接口可能是有意义的

    抽象类:

    public class MyClass extends BaseClass {
    
        private String name;
    
        // constructors
    
        @Override
        String getName() {
            return name;
        }
    
        // setters
    }
    
    public abstract class BaseClass {
        abstract String getName();
    }
    

    接口:

    public class MyClass implements DtoWithName {
    
        private String name;
    
        // constructors
    
        @Override
        String getName() {
            return name;
        }
    
        // setters
    }
    
    public interface DtoWithName {
        String getName();
    }
    

    另外,我不能从给定的示例中告诉您很多关于用例的信息,但是您应该阅读Composition over inheritance,以确保您以正确的方式进行操作。特别是对于DTO,通常简单是最好的