IT TIP

미디어 유형 = application / json에 대한 MessageBodyWriter를 찾을 수 없습니다.

itqueen 2020. 11. 25. 21:46
반응형

미디어 유형 = application / json에 대한 MessageBodyWriter를 찾을 수 없습니다.


JAX-RS 서비스를 JSON으로 사용하는 동안 문제가 발생했습니다.

아래에 내 코드를 추가했습니다.

이것은 내 서비스 클래스입니다.

//Sets the path to base URL + /hello
@Path("/hello") 
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class Hello {

    @GET
    @Produces("application/json")
    public Student getStudent() {

        Student s = new Student();
        s.first_name = "Test First Name !!!";
        s.last_name = "Test Last Name!!!";

        return s;
    }

Student 내가 서비스에서 얻으려고하는 클래스 :

@XmlRootElement
public class Student implements Serializable {

    public String first_name;
    public String last_name;

    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 Student()
    {
        first_name = "Fahad";
        last_name = "Mullaji";
    }
}

서비스 측의 웹 XML.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>com.vogella.jersey.first</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <!-- Register resources and providers under com.vogella.jersey.first package. -->
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.vogella.jersey.first</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app> 

이 문제를 해결하는 방법을 모르겠습니다. JSON 응답을 테스트하기 위해 SOAP UI를 사용하고 있지만 중요하지 않다고 생각합니다.

아래 코드를 추가해야하는 많은 곳을 읽었습니다. 그러나 나는 어디에 있는지 모른다. 빌드를 위해 Maven을 사용하지 않습니다.

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

서버가 Student객체를 JSON 으로 구문 분석하는 함수를 찾고 있지만 해당 함수 또는 jar 파일을 찾을 수 없습니다. Genson, Moxy, RESTEasy 및 Jackson 병을 추가했지만 그게 문제라고 생각합니다. 어딘가에 매핑이 누락 된 것 같습니다.


jersey-media-json-jackson을 설치하여 수정할 수있었습니다.

pom.xml에 종속성 추가

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <scope>runtime</scope>
</dependency>

JAX-RS가 클래스를 초기화하기 때문에 빈 생성자를 만들어야합니다 ... 생성자에는 인수가 없어야합니다.

@XmlRootElement
public class Student implements Serializable {

    public String first_name;
    public String last_name;

    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 Student()
    {
        first_name = "Fahad";
        last_name = "Mullaji";
    }


 public Student()
    {
    }
}

내가 같은 상황에 있었다
- 내가 한 하지 메이븐 또는 Ant를 사용하여
- 나는 완료 뉴저지에서이 Vogella 자습서를 ,
- 그리고 나는 얻고 있었다 MessageBodyWriter사용하려고 할 때 오류 @Produces(MediaType.APPLICATION_JSON).

@peeskillet 의이 답변 은 문제를 해결합니다 . FasterXML Jackson 다운로드 페이지 에서 사용할 수있는 Jackson * .jar 파일을 사용해야합니다 . core파일과 파일 이 필요 jaxrs합니다.

I added them to my WebContent/WEB-INF/lib folder where I have my Jersey *.jar files per the above tutorial, and made the small change to the web.xml file below (again, as originally shared by @peeskillet):

<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
    your.other.package.here, com.fasterxml.jackson.jaxrs.json 
</param-value>

The important part being com.fasterxml.jackson.jaxrs.json.


Uncommenting the below code helped

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
</dependency>

which was present in pom.xml in my maven based project resolved this error for me.


Below should be in your pom.xml above other jersy/jackson dependencies. In my case it as below jersy-client dep-cy and i got MessageBodyWriter not found for media type=application/json.

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.25</version>
</dependency>

Well, I could not make the above web project working. But I kept on doing research on JAX-RS and I came across Stormpath's tutorial. I think whoever is trying to learn how REST, JSON and Jersey work together should watch this.

Please see links below for their presentation and sample REST project on GitHub .

https://www.youtube.com/watch?v=sVvL12BnIyQ

https://github.com/stormpath/todos-jersey

Now I can compare above project and see what all things I did wrong.


I think may be you should try to convert the data to json format. It can be done by using gson lib. Try something like below.

I don't know it is a best solutions or not but you could do it this way.It worked for me

example : `

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response info(@HeaderParam("Accept") String accept) {
    Info information = new Info();
    information.setInfo("Calc Application Info");
    System.out.println(accept);
    if (!accept.equals(MediaType.APPLICATION_JSON)) {
        return Response.status(Status.ACCEPTED).entity(information).build();
    } else {
        Gson jsonConverter = new GsonBuilder().create();
        return Response.status(Status.ACCEPTED).entity(jsonConverter.toJson(information)).build();
    }
}

To overcome this issue try the following. Worked for me.

Add following dependency in the pom.xml

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-json-jackson</artifactId>
  <version>2.25</version>
</dependency>

And make sure Model class contains no arg constructor

 public Student()
    {
    }

참고URL : https://stackoverflow.com/questions/26207252/messagebodywriter-not-found-for-media-type-application-json

반응형