enablewebsecurity xml spring rest jaxb spring-boot

enablewebsecurity - Spring Boot REST con soporte XML



spring security release (3)

Hice el servicio web de descanso simple con Spring Boot 1.2.5 y funciona bien para json, pero no puedo hacer que esto funcione para devolver xml.

Este es mi controlador:

@RestController .. @RequestMapping(method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}) @ResponseStatus(HttpStatus.OK) public List<Activity> getAllActivities() { return activityRepository.findAllActivities(); }

Cuando lo llamo con Aceptar: application / json todo funciona, pero cuando intento con application / xml obtengo un poco de HTML con 406 Error y mensaje:

The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

Mis objetos modelo:

@XmlRootElement public class Activity { private Long id; private String description; private int duration; private User user; //getters & setters... } @XmlRootElement public class User { private String name; private String id; //getters&setters... }


Mi pom.xml

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.5.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

¿Necesito algunos frascos adicionales en mi pom.xml para que esto funcione? Intenté agregar jaxb-api o jax-impl pero no me ayudó.


Pls intente esto

public @ResponseBody getAllActivities() {

en lugar de

public List<Activity> getAllActivities() {


Para que esto funcione en Spring Boot sin usar Jersey, necesitamos agregar esta dependencia:

<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>

La salida será un poco fea pero funciona:

<ArrayList xmlns=""> <item> <id/> <description>Swimming</description> <duration>55</duration> <user/> </item> <item> <id/> <description>Cycling</description> <duration>120</duration> <user/> </item> </ArrayList>

Aquí hay un buen tutorial: http://www.javacodegeeks.com/2015/04/jax-rs-2-x-vs-spring-mvc-returning-an-xml-representation-of-a-list-of-objects .html


Podemos lograr esto de la siguiente manera:

Código

package com.subu; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.xml.bind.annotation.*; @Entity @XmlRootElement(name = "person") @Table(name="person") public class Person implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @XmlAttribute(name = "first-name") private String first_name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } public String getDate_of_birth() { return date_of_birth; } public void setDate_of_birth(String date_of_birth) { this.date_of_birth = date_of_birth; } @XmlAttribute(name = "last-name") private String last_name; @XmlAttribute(name = "dob") private String date_of_birth; }

@RestController public class PersonController { @Autowired private PersonRepository personRepository; @RequestMapping(value = "/persons/{id}", method = RequestMethod.GET,produces={MediaType.APPLICATION_XML_VALUE},headers = "Accept=application/xml") public ResponseEntity<?> getPersonDetails(@PathVariable Long id, final HttpServletRequest request)throws Exception { Person personResponse=personRepository.findPersonById(id); return ResponseEntity.ok(personResponse); } }

package com.subu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @Configuration @ComponentScan @EnableAutoConfiguration @EnableScheduling public class Application extends SpringBootServletInitializer{ public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } private static Class<Application> applicationClass = Application.class; }