Spring-boot从控制器返回json和xml
我有一个Spring-boot
1.1.7应用程序,该应用程序的大部分UI使用Thymeleaf,因此控制器的响应实际上并不是问题。但是,现在当用户通过URL提交请求时,我需要提供XML响应。
这是一个典型的请求:
http://localhost:9001/remote/search?sdnName=Victoria&address=123 Maple Ave
这是我大部分的gradle配置:
project.ext { springBootVersion = '1.1.7.RELEASE'
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion")
compile("org.springframework.security:spring-security-web:4.0.0.M1")
compile("org.springframework.security:spring-security-config:4.0.0.M1")
compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.1.RELEASE')
compile("org.springframework.boot:spring-boot-starter-actuator")
compile('com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.5.0')
}
这是我的控制器:
@Controllerpublic class RemoteSearchController {
@Autowired
private SdnSearchService sdnSearchService;
@RequestMapping(value = "/remote/search", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
public List<Sdn> search(@ModelAttribute SdnSearch sdnSearch) {
List<Sdn> foundSdns = sdnSearchService.find( sdnSearch );
return foundSdns;
}
这是我要返回的对象:
@Entitypublic class Sdn {
@Id
private long entNum;
private String sdnName;
...
//getters & setters here
}
我能够通过REST客户端(例如CocoaREST)接收请求并进行处理。但是,当我返回SDN列表时,即使我的类路径上确实有Jackson&jackson-
dataformat-xml,我也会收到以下异常:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:229)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:301)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:248)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:57)
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:299)
我的REST客户端包括一个“ text /
xml”的接受标头(但老实说,我希望他们不必设置此标头。理想情况下,对该控制器的任何调用都将始终获取XML,而不管标头是否存在)。
有办法解决吗?我以为包含了媒体转换器,只是返回了控制器告诉他们的内容?
解决方案:请参阅以下我发布的答案。
回答:
解决方案:我在下面结合使用了两个答案(非常感谢!)。如果有人需要帮助,我会在这里发布。
我修改后的控制器:
@Controllerpublic class RemoteSearchController {
@Autowired
private SdnSearchService sdnSearchService;
@RequestMapping(value = "/remote/search", method = RequestMethod.GET, produces = { "application/xml", "text/xml" }, consumes = MediaType.ALL_VALUE )
@ResponseBody
public SdnSearchResults search(@ModelAttribute SdnSearch sdnSearch) {
List<Sdn> foundSdns = sdnSearchService.find( sdnSearch );
SdnSearchResults results = new SdnSearchResults();
results.setSdns( foundSdns );
return results;
}
}
在我的客户端上,我设置了请求标头:
内容类型:应用程序/文本接受:文本/
xml我认为最终的问题是我的客户端标头设置不正确,因此我可能不必进行一些更改。但我喜欢包含结果列表的SearchResults类的想法:
@XmlRootElementpublic class SdnSearchResults {
private List<Sdn> sdns;
...
}
以上是 Spring-boot从控制器返回json和xml 的全部内容, 来源链接: utcz.com/qa/429069.html