2016-02-08 55 views
1

我用java和Spring MVC工作,在程序的第一個版本,我響應了ResponseEntity<String>並在那裏我haved和錯誤,我回到像return new ResponseEntity<String>(httpErrors.toString(), responseHeaders, HttpStatus.BAD_REQUEST);,當所有是正確的像return new ResponseEntity<String>(loginResponse.toString(), responseHeaders, HttpStatus.OK);。但是現在我相信那裏有一個更好的辦法來做到這一點,而不使用toString()方法,返回特定對象按照這樣的案例:的Spring Java ResponseEntity <T>有多個參數類型

@RestController 
@RequestMapping("/user") 
public class LoginController { 

    /** The login service to validate the user. */ 
    @Autowired 
    LoginService loginService; 

    @RequestMapping(value = "/login", method = RequestMethod.POST) 
    public @ResponseBody ResponseEntity<?> validate(@RequestBody final UserLog login) { 

     WebUser webUser = loginService.getUserDetails(login.getLogin(), login.getPassword()); 
     HttpHeaders responseHeaders = new HttpHeaders(); 
     responseHeaders.setContentType(MediaType.APPLICATION_JSON); 

     if (webUser == null) { 
      HttpErrors httpErrors = new HttpErrors(ApiCommonResources.ERROR_402, "error" + "." + ApiCommonResources.ERROR_402, ApiCommonResources.ERROR_402_TEXT); 
      return new ResponseEntity<HttpErrors>(httpErrors, responseHeaders, HttpStatus.BAD_REQUEST); 
     } 

     List<Account> userAccounts = loginService.getMerchantAccounts(webUser.getMerchantId()); 

     // Json Web Token builder 
     token = "b7d22951486d713f92221bb987347777"; 

     LoginResponse loginResponse = new LoginResponse(ApiCommonResources.SUCCESS_REQUEST_CODE, token); 

     return new ResponseEntity<LoginResponse>(loginResponse, responseHeaders, HttpStatus.OK); 

    } 

} 

問題是我怎麼可以創建一個類,可以包裝了LoginResponse以及HttpErrors對象類型和?形式發送給我們返回的對象ResponseEntity:

LoginResponse類:

public class LoginResponse{ 

    public LoginResponse(Integer statusCode, String token){ 
     this.setStatusCode(statusCode); 
     this.setToken(token); 
    } 

    private String token; 
    private Integer statusCode; 

    public String getToken() { 
     return token; 
    } 

    public void setToken(String token) { 
     this.token = token; 
    } 

    public Integer getStatusCode() { 
     return statusCode; 
    } 

    public void setStatusCode(Integer statusCode) { 
     this.statusCode = statusCode; 
    } 

    @Override 
    public String toString() { 

     StringBuilder jsonResponse = new StringBuilder(); 

     jsonResponse.append("{"); 
     jsonResponse.append("\"statusCode\":"); 
     jsonResponse.append("\"" + statusCode + "\","); 
     jsonResponse.append("\"token\":"); 
     jsonResponse.append("\"" + token + "\""); 
     jsonResponse.append("}"); 

     return jsonResponse.toString(); 
    } 

} 

而且HttpErrors類:

public class HttpErrors { 

    public HttpErrors(){ 
    } 

    public HttpErrors(String errorCode, String errorKey, String errorMessage) { 
     super(); 
     this.errorCode = errorCode; 
     this.errorKey = errorKey; 
     this.errorMessage = errorMessage; 
    } 

    private String errorCode; 
    private String errorKey; 
    private String errorMessage; 

    public String getErrorCode() { 
     return errorCode; 
    } 

    public void setErrorCode(String errorCode) { 
     this.errorCode = errorCode; 
    } 

    public String getErrorKey() { 
     return errorKey; 
    } 

    public void setErrorKey(String errorKey) { 
     this.errorKey = errorKey; 
    } 

    public String getErrorMessage() { 
     return errorMessage; 
    } 

    public void setErrorMessage(String errorMessage) { 
     this.errorMessage = errorMessage; 
    } 

    @Override 
    public String toString() { 

     StringBuilder jsonError = new StringBuilder(); 

     jsonError.append("{"); 
     jsonError.append("\"errorCode\":"); 
     jsonError.append("\"" + errorCode + "\","); 
     jsonError.append("\"errorKey\":"); 
     jsonError.append("\"" + errorKey + "\","); 
     jsonError.append("\"errorMessage\":"); 
     jsonError.append("\"" + errorMessage + "\""); 
     jsonError.append("}"); 

     return jsonError.toString(); 
    } 

} 
+0

使用泛型,使LoginRespons e擴展了一個抽象的泛型響應類型...也將所有常見的方法llike狀態碼放入其中。 – yUdoDis

+0

謝謝@yUdoDis,你能幫我舉個例子嗎? – AndreFontaine

+0

考慮使用ControllerAdvice進行控制器異常處理,並使用適當的消息和HttpStatus(我現在使用的一些隨機示例)進行響應:http://blog.codeleak.pl/2013/11/controlleradvice-improvements-in-spring。html – patrykos91

回答

1
public class Response<T> { 

    private int httpStatus; 
    private T data; 

    //getter and setter consructor 

    eg constructors 
    public RestResponse(T data){ 
    this(HTTP_OK,data) 
    } 

    public RestResponse(int httpStatus,T data){ 
    this.httpStatus = httpStaus; 
    this.data = data; 

    } 

現在只要使用這個模板爲您的所有響應對象(repsone對象可以是POJO的太)

return new RestEntity<LoginResponse>(loginResponse,statusCode) //loginResponse object 

其中LoginResponse是

public class LoginResponse { 
private String token; 
//getter and setter and constructors. 
} 

你應該花一些時間建立一個REST合約(閱讀關於它使用谷歌:)),然後通過使用這個基本邏輯。 Java和春天一起是魔術。 玩得開心。

0

也許嘗試這樣的事情(在我看來,這將是更優雅)

在控制器返回LoginResponse創建一個方法,但首先執行輸入UserLog的驗證,一旦有任何問題,引發自定義例外,這最終將由exceptionHandler

被抓在我的例子控制器

@RestController 
public class ProductController { 
    private ProductRequestValidator productRequestValidator; 

    @InitBinder 
    public void initBinder(WebDataBinder binder){ 
     binder.addValidators(productRequestValidator); 
    } 

    @Autowired 
    public ProductController(ProductRequestValidator productRequestValidator, ProductService productService) { 
     this.productRequestValidator = productRequestValidator; 
    } 

    @RequestMapping(value = "/products", method = RequestMethod.GET) 
    public List<ProductResponse> retrieveProducts(@Valid @RequestBody ProductRequest requestProduct, BindingResult bindingResult) 
      throws ValidationException { 

     // validate input and throw exception if any error occured 
     if (bindingResult.hasErrors()){ 
      throw new ValidationException(bindingResult); 
     } 

     // business logic 
     return new ProductRequest(); 
} 

看看,如果你願意,你可以檢查我的親到位桶實現這已說明了一切JECT:

相關問題