我正在尝试处理POST请求中丢失的json数据。我的控制器类
@Controller
@RequestMapping("/testMetrics")
public class TestMetricsEndPoint extends StatusEndpointHandler implements RestEndPoint<TestMetrics,String> {
@Autowired
private ObjectMapper mapper;
@Autowired
private TestMetricsService testMetricsService;
@Override
public Status get(String id) {
// TODO Auto-generated method stub
return null;
}
@Override
@RequestMapping(method = RequestMethod.POST,consumes = "application/json", produces = "application/json")
public @ResponseBody Status create(@RequestBody TestMetrics core, BindingResult bindingResult) {
try {
if(bindingResult.hasErrors()){
throw new InvalidRequestException("Add failed, Please try again ", bindingResult);
}
if((core.getGroupName()==""||core.getGroupName()==null)&&(core.getTestName()==null||core.getTestName()=="")){
throw new MissingParametersException(HttpStatus.BAD_REQUEST.value(),"Please provide all necessary parameters");
}
TestMetrics dataObject = testMetricsService.create(core);
return response(HttpStatus.CREATED.value(),dataObject);
}catch (MissingParametersException e) {
return response(HttpStatus.BAD_REQUEST.value(),e.getLocalizedMessage());
}
}
扩展类:
public class StatusEndpointHandler {
public Status response(Integer statusCode,Object data){
Status status = new Status();
status.setData(data);
status.setStatus(statusCode);
return status;
}
}
已实现的接口:
public interface RestEndPoint<T extends SynRestBaseJSON, ID extends Serializable> {
Status get(ID id);
Status create(T entity, BindingResult bindingResult);}
请看突出显示的部分,所以,当我试图通过邮差测试结果,我得到的状态为200 OK。我不知道怎么解决它。请帮我处理一下这种情况。如何获得正确的状态代码??
问题是处理字符串比较的代码,要比较字符串,必须使用equals
,Postman还会传递空的testName和groupName
if ((core.getGroupName() == "" || core.getGroupName() == null) && (core.getTestName() == null || core.getTestName() == "")) {
}
因此将代码更改为下面
if ((core.getGroupName() == null || core.getGroupName().trim().isEmpty()) && (core.getTestName() == null || core.getTestName().trim().isEmpty())) {
}
还要为此编写exceptionhandler
@ExceptionHandler({ MissingParametersException.class })
public ModelAndView handleException(ServiceException ex, HttpServletResponse response) {
response.setStatus(HttpStatus.BAD_REQUEST.value());
ModelMap model = new ModelMap();
model.addAttribute("message", ex.getMessage());
return new ModelAndView("error", model);
}
您还可以使用验证api在实体类中定义验证约束,在这种情况下,您需要将@valid
添加到请求模型对象
@Entity
class TestMetrics {
@Id
Long id;
@NotNull
@NotEmpty
@Column
String groupName;
@NotNull
@NotEmpty
@Column
String testName;
// Getters and Setters
}
您应该将返回类型从@responseBody
更改为responseEntity
,这将允许您操作头,因此设置状态,这是文档中的一个片段
@RequestMapping("/handle")
public ResponseEntity<String> handle() {
URI location = ...;
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setLocation(location);
responseHeaders.set("MyResponseHeader", "MyValue");
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}
问题内容: 我们正在进行有关如何处理REST异常的持续讨论。 响应内容类型:JSON 我们有两种解决方案: 将所有未检查的异常作为JSON响应抛出。 发送请求无效响应代码。 参数: 当出现错误时,为什么要返回JSON?只需发送无效的响应码即可。 相反的观点: 对于普通开发人员而言,响应代码的技术性太强。 你怎么说? 问题答案: 对于JSON API,我最近开发了两者。我总是使用有效的JSON进行响
我已经为我的spring boot应用程序创建了一个自定义REST控制器异常处理程序。。。 ... 我处理验证、业务(由于违反业务规则而导致的异常)和技术(与数据库相关、无效的请求参数等)异常。 异常类有两个参数:errorCode(唯一枚举)和消息(异常详细信息)。 正如您从示例中看到的,对于所有情况,我都会返回BAD_REQUEST(400)状态,这不是最佳做法。 我想知道基于异常类别处理HT
当程序出现错误或者异常时,我们一般会希望在开发时输出报错信息,在生产环境时隐藏详细的信息。 在 imi 中,提供了 Http 服务的错误异常默认处理器支持。 默认 Http 错误处理器:Imi\Server\Http\Error\JsonErrorHandler 指定默认处理器 配置文件中: return [ 'beans' => [ 'HttpErrorHan
我使用Spring中的webClient从GraphQL WebService中获取数据。此代码位于一个泛型方法中,该方法将响应体解码为不同类型的对象。如果响应是预期的类型,则它运行良好。 现在我想处理来自WebService的错误。因此,我的问题与此非常相似:Spring Webflux:Webclient:Get body on error我发现建议使用onStatus,但我的问题是,即使re
如何在SpringMVC中实现自定义http错误处理。 例如:我有一个urlhttp://localhost:8080/demo/canvas 它显示我的画布页面,但如果用户错过了网址并键入http://localhost:8080/demo/canva 它显示了Tomcat呈现的HTTP状态404。我希望它是自定义jsp页面。
问题内容: 我正在尝试建立一个大型的REST服务服务器。我们正在使用Spring Boot 1.2.1,Spring 4.1.5和Java8。我们的控制器正在实现@RestController和标准的@RequestMapping注释。 我的问题是Spring Boot为控制器异常设置了默认重定向到/error。从文档: Spring Boot默认提供一个/ error映射,以一种明智的方式处理所