Tag: spring restcontroller

unit testingSpring MissingServletRequestParameterException JSON响应

我在Spring引导rest控制器中有POST方法,如下所示 @RequestMapping(value=”/post/action/bookmark”, method=RequestMethod.POST) public @ResponseBody Map bookmarkPost( @RequestParam(value=”actionType”,required=true) String actionType, @RequestParam(value=”postId”,required=true) String postId, @CurrentUser User user) throws Exception{ return service.bookmarkPost(postId, actionType, user); } 现在,如果我在Postman中测试缺少参数,我会获得400个http响应和一个JSON正文: { “timestamp”: “2015-07-20”, “status”: 400, “error”: “Bad Request”, “exception”: “org.springframework.web.bind.MissingServletRequestParameterException”, “message”: “Required String parameter ‘actionType’ is not present”, “path”: “/post/action/bookmark” } 直到现在它没关系,但是当我尝试进行unit testing时,我没有得到JSON响应 @Test public void bookmarkMissingActionTypeParam() throws Exception{ // @formatter:off […]

在SpringMVC的上下文中,如何使用提供同一类的不同JSON表示的Web服务?

我有一个数据类,如下所示: public class Person { private String name; private Long code; // corresponding getters and setters } 我想编写两个Web服务,它们提供两种不同的JSON表示forms。 例如,其中一个提供{“name”:”foo”}但另一个提供{“name”:”foo”, “code”:”123″} 。 作为一个更复杂的场景,假设Person有一个引用属性,例如address。 地址也有自己的属性,我希望我的两个Web服务都考虑这个属性,但每个属性都以自己的方式执行。 我的SpringMVC视图应该如何? 请注意,我是SpringMVC的新手。 请在答案旁边给我一个示例代码。 更新1:几天后,所有答案都促使我解决控制器中的问题或通过注释数据类。 但是我希望在视图中执行此操作,而不再使用java代码。 我可以在JSP文件或百万美元模板甚至.properties文件中执行此操作吗? 更新2:我找到了json-taglib 。 但不知何故,它被排除在新的升级之外。 有没有类似的解决方案?

在Spring REST控制器中读取HTTP标头

我试图在基于Spring的REST API中读取HTTP头。 我跟着这个 。 但是我收到了这个错误: 没有为类java.lang.String找到消息正文阅读器, ContentType:application / octet-stream 我是Java和Spring的新手,所以无法弄清楚这一点。 这就是我的通话方式: @WebService(serviceName = “common”) @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public interface CommonApiService { @GET @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) @Path(“/data”) public ResponseEntity getData(@RequestHeader(value=”User-Agent”) String userAgent, @DefaultValue (“”) @QueryParam(“ID”) String id); } 我试过@Context :在这种情况下,HTTPHeader为null 。 如何从HTTP标头中获取值?

其他包中的@RestController不起作用

我开始学习Spring,然后创建基本项目,创建数据库,插入值,然后在Web浏览器中打印它。 我的问题是,当我将RestController放在像主类一样的包中时 – 它可以,但我想将它分发给其他包,当我创建新包时,移动RestController它不起作用。 让我们解释一下: 我的项目看起来像: |-Springtestv_01 |-src/main/java |–com.person <– it's a main package |-Main.java |-Person.java |-PersonLineRunner.java |-PersonRepository.java |-PersonController.java |-com.controller <– second package, I want put here PersonController.java |-src/main/resources |-data.sql pom.xml 我的控制器看: @RestController public class PersonController { @Autowired PersonRepository personRepository; @RequestMapping(“/persons”) Collection persons(){ return this.personRepository.findAll(); } } 当所有内容都在com.person包中时,我在web浏览器中写道http:// localhost:8080 /个人并且它正常工作……但我想将PersonController.java移动到com.controller包,当我移动它时,我的webbrowers打电话给我 出现意外错误(type = Not Found,status = […]

如何处理Spring Boot中的最大文件大小exception?

我使用Spring Boot v1.2.5创建REST应用程序。 上传图片时,我检查了最大文件大小,提供了以下属性: multipart.maxFileSize= 128KB 在application.properties中。 该工具由Spring Boot本身提供。 现在检查工作正常。 问题是,我如何处理exception并向用户返回他能理解的消息? 更新1 ———- 我在Controller中编写了一个方法,我打算使用@ExceptionHandler来处理MultipartException。 它似乎不起作用。 这是我的代码: @ExceptionHandler(MultipartException.class) @ResponseStatus(value = HttpStatus.PAYLOAD_TOO_LARGE) public ApplicationErrorDto handleMultipartException(MultipartException exception){ ApplicationErrorDto applicationErrorDto = new ApplicationErrorDto(); applicationErrorDto.setMessage(“File size exceeded”); LOGGER.error(“File size exceeded”,exception); return applicationErrorDto; } 更新2 ———- 在@luboskrnac指出之后,我设法找到了解决方案。 我们可以在这里使用ResponseEntityExceptionHandler来处理这种特殊情况。 我相信,我们也可以使用DefaultHandlerExceptionResolver ,但是ResponseEntityExceptionHandler将允许我们返回ResponseEntity ,而不是前者,其方法将返回ModelAndView 。 我没有尝试过。 这是我用来处理MultipartException的最终代码: @ControllerAdvice public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { […]

使用spring @RestController在null上返回HTTP 204

这将返回200 OK,Content-Length:0 @RestController public class RepoController { @RequestMapping(value = “/document/{id}”, method = RequestMethod.GET) public Object getDocument(@PathVariable long id) { return null; } } 简单地说,我希望它返回204 No Content on null。 有没有办法强制spring-mvc / rest在null而不是200时返回204? 我不想更改每个rest方法以返回ResponseEntity或类似的东西,只将null映射到204

Spring thring HttpMediaTypeNotAcceptableException:由于url路径中的点而找不到可接受的表示

最终编辑 因此,在研究了这个之后因为我所看到的答案并没有完全成熟,我发现Spring做了一些奇怪的扩展匹配。 如果我通过byNameOrAtlName/myStringHere.1或者这个byNameOrAtlName/myStringHere.12提交这样的请求,一切都很好,但byNameOrAtlName/myStringHere.123会导致它像byNameOrAtlName/myStringHere.com那样byNameOrAtlName/myStringHere.com ,但是byNameOrAtlName/myStringHere.co ,但byNameOrAtlName/myStringHere.c不是。 总而言之,我不知道逻辑spring用于确定扩展内容,但对于某些扩展, {varName:.+}可以作为一种解决方法,但看起来你需要完全禁用点文件后缀才能真正实现绕过它。 使用Spring 4.1.6 Spring抛出以下exceptionorg.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 我有以下代码,除非字符串(名称)中有句号,否则一切正常。 @RestController @RequestMapping(value = “/foo/”) public class Testing{ @RequestMapping(value = “byNameOrAltName/{name:.+}”, method = RequestMethod.GET) @Transactional(readOnly = true) public Collection getByNameOrAltNAme(@PathVariable(“name”) String name) { return myRepo.getMyDTOsByNameOrAtlName(name); } } 这样可行。 http://localhost:8080/data/foo/byNameOrAtlName/myStringHere ,但是如果我这样做则会失败http://localhost:8080/data/foo/byNameOrAtlName/myStringHere.fluffy 我阅读了关于这个例外的其他答案,但它们似乎都不适用于我的案例。 起初我认为这是spring不喜欢路径中的时间段的问题,并且我在使用正则表达式之前修复了它.+但我在使用和不使用正则表达式时都尝试了它并且我得到了同样的错误。 关于为什么Spring会抛出这个的任何想法? 编辑 这是我的调试日志: 21:32:09,118 DEBUG work.orm.jpa.support.OpenEntityManagerInViewFilter: 161 – […]

弹簧静止控制器返回特定字段

我一直在思考使用Spring MVC设计JSON API的最佳方法。 我们都知道IO很昂贵,因此我不想让客户端进行多次API调用以获得他们需要的东西。 但与此同时,我不一定要回厨房水槽。 作为一个例子,我正在开发类似于IMDB的游戏API,而不是用于video游戏。 如果我返回与游戏相关的所有内容,它将看起来像这样。 / API /游戏/ 1 { “id”: 1, “title”: “Call of Duty Advanced Warfare”, “release_date”: “2014-11-24”, “publishers”: [ { “id”: 1, “name”: “Activision” } ], “developers”: [ { “id”: 1, “name”: “Sledge Hammer” } ], “platforms”: [ { “id”: 1, “name”: “Xbox One”, “manufactorer”: “Microsoft”, “release_date”: “2013-11-11” }, { […]