gpt4 book ai didi

java - 使用 Spring MVC 管理 REST 响应

转载 作者:行者123 更新时间:2023-11-30 03:15:49 25 4
gpt4 key购买 nike

我正在使用 Spring 创建 REST api。目前我使用这个结构来提供文件浏览器服务:

文件模型.java

package hello;


public class FileModel {
private String name;
private Long lastUpdate;
private Long size;

/**
* Void Constructor
*/
public FileModel() {
}


/**
* Parametrized constructor
* @param name
* @param created
* @param lastUpdate
* @param size
*/
public FileModel(String name, Long lastUpdate, Long size) {
super();
this.name = name;
this.lastUpdate = lastUpdate;
this.size = size;
}


/**
* @return the name
*/
public String getName() {
return name;
}


/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}


/**
* @return the lastUpdate:A long value representing the time the file was last modified,
* measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970)
*/
public Long getLastUpdate() {
return lastUpdate;
}


/**
* @param lastUpdate the lastUpdate to set
*/
public void setLastUpdate(Long lastUpdate) {
this.lastUpdate = lastUpdate;
}


/**
* @return the size in bytes
*/
public Long getSize() {
return size;
}


/**
* @param size the size to set
*/
public void setSize(Long size) {
this.size = size;
}


}

文件服务.java

    package hello;

import java.io.File;
import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.util.ArrayList;

import org.springframework.stereotype.Service;

@Service
public class FileServices {

public ArrayList<FileModel> getAllFiles(String path) throws FileNotFoundException {
ArrayList<FileModel> files=new ArrayList<FileModel>();
File directory = new File(path);
if (directory.exists()){
//get all the files from a directory
File[] fList = directory.listFiles();
//check if list is null
for (File file : fList){
if (file.isFile()){
FileModel f=new FileModel(file.getName(),file.lastModified(),file.length());
files.add(f);
}
}
return files;
}
else throw new ResourceNotFoundException(path);
}
}

ResourceNotFoundException.java

    package hello;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
private static final long serialVersionUID = 1L;

public ResourceNotFoundException(String path){
super("The specified path: "+ path +" doesn't exist");
}
}

文件管理器

    package hello;

import java.io.FileNotFoundException;
import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FileManager {

@Autowired
private FileServices file;

@RequestMapping(value = "/files", method = RequestMethod.GET)
public Collection<FileModel> getAllFiles(@RequestParam(value="path", defaultValue="/home") String path) throws FileNotFoundException {
return file.getAllFiles(path);
}

}

响应是这样的错误消息

> {   "timestamp": 1442560477794,   "status": 404,   "error": "Not
> Found", "exception": "hello.ResourceNotFoundException", "message":
> "The specified path: /home doesn't exist", "path":
> "/MatlabLib/files" }

或者这个。

[
{
"name": "apache-tomcat-8.0.26-windows-x64.zip",
"lastUpdate": 1441282759343,
"size": 10470002
},
{
"name": "desktop.ini",
"lastUpdate": 1441357976196,
"size": 282
}
]

鉴于我必须通过其他 java 或 matlab 代码管理此 Web 服务,我需要一个自定义响应,例如状态、错误、异常、消息、正文,以便我可以检查状态代码并了解是否存在错误或更少。 Spring中有没有一种构建方法可以做到这一点?

谢谢

更新:我创建了两个响应类,一个用于 ErrorResponse,一个用于具有不同数量字段的响应。然后我用了

@ControllerAdvice 
public class ErrorController {

/**
*
* @param e: exception thrown
* @return ErroreResponse
*/
@ExceptionHandler(Exception.class)
public @ResponseBody ErrorResponse errorHandler(Exception e){
//Make the exception by buildErrorResponse
return ErrorResponseBuilder.buildErrorResponse(e);
}

在ErrorResponseBuilder中做了这个方法:

/**
* Build exception response beginning from exception
* @param e exception thrown
* @return ErrorResponse: response of an exception
*/
public static ErrorResponse buildErrorResponse(Exception e){
StringWriter errors = new StringWriter();
e.printStackTrace(new PrintWriter(errors));
return new ErrorResponse(HttpStatusManager.getHttpCode(e),e.getClass().getName(),e.getMessage(),errors.toString());
}

在 HttpStatusManager 中我实现了这个:

public HttpStatusManager() {
}

/**
* Add to this class all new exception associating a code error
* @param exception
* @return
*/
public static int getHttpCode(Exception exception){
if (exception instanceof ResourceNotFoundException);
return HttpStatus.NOT_FOUND.value();
}

因此从控件中使用这个简单的行

@RequestMapping(value = "/files", method = RequestMethod.GET)
public Response<Collection<FileModel>> getAllFiles(@RequestParam(value="path", defaultValue="/home") String path) throws ResourceNotFoundException {
Collection<FileModel> result;
result = file.getAllFiles(path);
return new Response<Collection<FileModel>>(HttpStatus.OK.value(),result);
}

你觉得怎么样?

最佳答案

您可以使用javax.ws.rs.core.Response,它有很好的API。但就我个人而言,我宁愿创建一个自定义类来处理此类响应。

当然,您需要附加到您的项目中Jackson JSON API 这样您就可以构建返回对象的方法。此外,您还必须在 Spring 配置文件中配置 messageConverters

<小时/>

更新

public class Response {

private Object responseBody;
private String message;
private int responseCode;
public Response() {
responseCode = 200; //default HTTP 200 OK
}
public Object getResponseBody() {
return responseBody;
}

public void setResponseBody(Object responseBody) {
this.responseBody = responseBody;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public int getResponseCode() {
return responseCode;
}

public void setResponseCode(int responseCode) {
this.responseCode = responseCode;
}


}

使用示例

  @RequestMapping(value = "/files", method = RequestMethod.GET)
public Response getAllFiles(@RequestParam(value="path", defaultValue="/home") String path) {
Response response = new Response();
try {
Collection<FileModel> files = file.getAllFiles(path);
response.setResponseBody(files);
} catch (FileNotFoundException e) {
Utils.setErrMessage(response, e);
}

return response;
}

您的setErrMessage函数可能如下所示

public void setErrMessage(Response response, Exception e) {
if(e instanceof NullPointerException) {
response.setErrCode(400); //HTTP 400 Bad Request
}
else if(e instanceof FileNotFoundException || ...) {
response.setErrCode(500); //HTTP 500 Interval Server Error
}
...
response.setMessage(e.getMessage);
}

这只是一个大概的想法,你可以随意更改。

关于java - 使用 Spring MVC 管理 REST 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32646364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com