从您的角度来看,从Spring REST Controller返回一个简单对象的最佳方法是什么?
一种方法是创建一个对象
@RestController
public MyObj x(){...}
class MyObj {
String a;
List<String> bList;
}
如果您有多个此类对象,则每个对象最终会有许多单独的文件。
另一种方法是使用地图
@RestController
public Map<String, List<String>>x(){
return service...dao.getInfo();
}
public Map<String, List<String>> dao.getInfo() {...}
这有点难以阅读,你需要到达DAO才能看到它返回的内容。它需要一个非常好的文档。
有没有其他方法可以获得类似的行为?
地图是在服务架构中解决此问题的好方法吗?
答案 0 :(得分:1)
我认为最好的方法是创建一个通用对象RestResponse,它包含通用的有效负载。然后让工厂能够为您的有效负载创建正确的响应。
RestResponse:
public class RestResponse<T> {
private int responseCode;
private T payload;
public RestResponse() {
}
public RestResponse(int responseCode) {
this.responseCode = responseCode;
}
public T getPayload() {
return payload;
}
public void setPayload(T payload) {
this.payload = payload;
}
}
厂:
@Component
public class RestResponseFactory {
public <T> ResponseEntity<RestResponse<T>> newRestResponse(HttpStatus status) {
return newRestResponse(null, status);
}
public <T> ResponseEntity<RestResponse<T>> newRestResponse(T resource, HttpStatus status) {
RestResponse<T> response = new RestResponse<T>();
response.setResponseCode(status.value());
response.setPayload(resource);
return new ResponseEntity<RestResponse<T>>(response, status);
}
}
然后在您的Rest控制器中,您应该能够使用工厂生成有效负载。
ResponseEntity<RestResponse<MyRessource>> response =
responseFactory.newRestResponse(new MyRessource("SomeData"), HttpStatus.CREATED);
这将允许您使用以下控制器生成具有任意对象的响应:
@Controller
@EnableAutoConfiguration
public class MyRessourceController {
@ResponseBody
@RequestMapping(value = "/dosomething", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<RestResponse<MyRessource>> dosomething() {
ResponseEntity<RestResponse<MyRessource>> response =
responseFactory.newRestResponse(new MyRessource("SomeData"), HttpStatus.CREATED);
return response;
}
}