У меня есть приложение spring -boot 1.1.7, которое использует Thymeleaf для большей части пользовательского интерфейса, поэтому ответ от моих контроллеров действительно не вызывает беспокойства. Однако теперь мне нужно предоставить ответ XML, когда пользователь отправляет запрос через URL.
Вот типичный запрос:
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')
}
И вот мой контроллер:
@Controller
public 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;
}
Вот мой объект, который нужно вернуть:
@Entity
public 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 включает в себя Accept Header "text/xml" (но, честно говоря, я бы предпочел, чтобы им не пришлось устанавливать это. В идеале любой вызов этого контроллера всегда будет получать XML, независимо от того, какой заголовок присутствует).
Есть ли способ справиться с этим? Я думал, что Media Converters были включены и просто вернули все, что им сказал контроллер.
РЕШЕНИЕ: Ниже приведен ответ, который я опубликовал.