복붙노트

[SPRING] XML 지원을 포함한 스프링 부트 REST

SPRING

XML 지원을 포함한 스프링 부트 REST

스프링 부트 1.2.5와 함께 간단한 REST 웹 서비스를 만들었고 JSON에서도 잘 작동하지만 XML을 반환 할 수는 없다.

이것은 내 컨트롤러 다.

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

Accept : application / json으로 호출하면 모든 것이 작동하지만 application / xml로 시도 할 때 406이라는 HTML이 표시됩니다. 오류 및 메시지 :

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

내 모델 객체 :

@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...
}

우리가 도울 것입니다.

<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>

이 작업을 수행하기 위해 pom.xml에 몇 개의 추가 jar가 필요합니까? jaxb-api 또는 jax-impl을 추가하려고 시도했지만 도움이되지 않았습니다.

해결법

  1. ==============================

    1.Jersey를 사용하지 않고 Spring Boot에서이 작업을하려면 다음과 같은 종속성을 추가해야합니다.

    Jersey를 사용하지 않고 Spring Boot에서이 작업을하려면 다음과 같은 종속성을 추가해야합니다.

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

    출력은 약간 추한 일이지만 작동합니다.

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

    여기 좋은 튜토리얼입니다 : http://www.javacodegeeks.com/2015/04/jax-rs-2-x-vs-spring-mvc-returning-an-xml-representation-of-a-list-of-objects.html

  2. ==============================

    2.우리는 아래와 같이 이것을 달성 할 수 있습니다 :

    우리는 아래와 같이 이것을 달성 할 수 있습니다 :

    암호

            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;
    
            }
    

  3. from https://stackoverflow.com/questions/32654291/spring-boot-rest-with-xml-support by cc-by-sa and MIT license