找不到媒体的MessageBodyReader

时间:2015-02-25 17:41:33

标签: java xml json

我试图使用java EE从IMDB.com或AnimeNewsNetwork的API中检索获取响应

我开始攻击这个人是连接到天气网站API的非常好的例子(必须安装vaadin视图框架)

看起来我已经取得了一些进展(特别是在理解发生了什么事情上)但是现在我遇到了一个问题很长一段时间(3个小时虽然很多都未能获得github)工作....)

我正在尝试运行该应用程序:

javax.servlet.ServletException: com.vaadin.server.ServiceException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html; charset=utf-8, type=class org.example.domain.ForecastResponse, genericType=class org.example.domain.ForecastResponse.

我粘贴了

<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.15</version>
</dependency>
进入pom的东西,我在netbeans中找到一个按钮,检查问题&#34;然后它会自动更新我的项目与依赖性,这需要很长时间,而且相当令人震惊,我认为它的工作然后

然后我尝试来回更改.request(MediaType.TEXT_HTML)到APPLICATION_JSON(imdb默认为json)和TEXT_HTML_TYPE或我试过的任何东西。

最后我尝试将我的查询输入从正确的电影ID tt1285016更改为不正确的一个,以查看当它只返回2个参数而不是20时,是否会产生不同的结果。这让我想到了一个问题:我的应用程序如何?知道如何将API的响应映射到类?正常响应是一个包含20个字段的JSON字符串,那么我的应用程序如何知道将它们放在哪里?也许这是缺失的环节。我只是将影片类属性更改为Response和Error以匹配从发送不正确的影片ID到API但仍然存在相同问题的2个返回

(几小时后):尝试使用动漫新闻网络的API运行并获得类似的错误,该错误在说&#34;找不到messagbodyreader&#34; for text / xml而不是text / html ...

我还尝试从jersey依赖文档中添加更多内容到pom文件中,其中一个使我的项目停止部署,即使在我删除并重建它之后我也玩得很开心。

下面我将粘贴我正在使用的代码。请注意我只是在攻击这个人的例子,试图让我的基本功能正常工作并避免改变其他任何东西,这样我才能理解我应该做的事情,然后再从头开始重新编写原型,然后开始计划实际项目!!我将来会有更多的教程/示例,所以除了我坚持的问题之外,不要担心我的代码:/

这是&#34;视图&#34;使用vaadin的java类 VaadinUI.java

package org.example;

import com.vaadin.annotations.Theme;
import com.vaadin.cdi.CDIUI;
import com.vaadin.data.Property;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.NativeSelect;
import com.vaadin.ui.UI;
import javax.inject.Inject;
import org.vaadin.maddon.label.Header;
import org.vaadin.maddon.layouts.MVerticalLayout;


/**
 * A simple example how to consume REST apis with JAX-RS and display that in 
 * a Vaadin UI.
 */
@CDIUI("")
@Theme("valo")
public class VaadinUI extends UI {

    @Inject
    JsonService service;
    ForecastDisplay display = new ForecastDisplay();
    NativeSelect citySelector = new NativeSelect("Choose city");

    @Override
    protected void init(VaadinRequest request) {

//        citySelector.addItems("tt1285016","tt1285016");
//        citySelector.addValueChangeListener(this::changeCity);
//        citySelector.setValue("tt1285016");

        setContent(new MVerticalLayout(
                        new Header("Simple REST weather"),
                        display));

                display.setForecast(service.fetchMovie());


    }




////        display.setForecast(service.getForecast(citySelector.getValue().toString()));
//    }

}

JsonService.java

package org.example;

import com.vaadin.annotations.Theme;
import com.vaadin.cdi.CDIUI;
import com.vaadin.data.Property;
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.NativeSelect;
import com.vaadin.ui.UI;
import javax.inject.Inject;
import org.vaadin.maddon.label.Header;
import org.vaadin.maddon.layouts.MVerticalLayout;


/**
 * A simple example how to consume REST apis with JAX-RS and display that in 
 * a Vaadin UI.
 */
@CDIUI("")
@Theme("valo")
public class VaadinUI extends UI {

    @Inject
    JsonService service;
    ForecastDisplay display = new ForecastDisplay();
    NativeSelect citySelector = new NativeSelect("Choose city");

    @Override
    protected void init(VaadinRequest request) {

//        citySelector.addItems("tt1285016","tt1285016");
//        citySelector.addValueChangeListener(this::changeCity);
//        citySelector.setValue("tt1285016");

        setContent(new MVerticalLayout(
                        new Header("Simple REST weather"),
                        display));

                display.setForecast(service.fetchMovie());


    }




////        display.setForecast(service.getForecast(citySelector.getValue().toString()));
//    }

}

ForecastDisplay.java

package org.example;

import java.util.Calendar;
import java.util.Date;
import org.example.domain.Forecast;
import org.example.domain.ForecastResponse;
import org.vaadin.maddon.label.Header;
import org.vaadin.maddon.label.RichText;
import org.vaadin.maddon.layouts.MVerticalLayout;


/**
 *
 * @author Matti Tahvonen <matti@vaadin.com>
 */
public class ForecastDisplay extends MVerticalLayout {

    String mainTemplate = "Tomorrow in there will be ";


    public ForecastDisplay() {
    }

    public void setForecast(ForecastResponse fr) {

//        removeAllComponents();
        removeAllComponents();
        addComponents(
                new Header(String.format(mainTemplate,fr.getMovie().getMovieInfo(),
                        fr.getMovie().getMovieInfo()))
        );

//        
//        for (Forecast f : fr.getList()) {
//            cal.add(Calendar.DAY_OF_MONTH, 1);
//            Date date = cal.getTime();
//            Double temperature = f.getTemp().getDay();
//            String desc = f.getWeather().get(0).getDescription();
//            String md = String.format(detailTemplate, date, temperature, desc);
//            addComponent(new RichText().withMarkDown(md));
        }
    }

ForecastResponse.java类

package org.example.domain;

import java.util.ArrayList;

public class ForecastResponse {



//    private String cod;
//    private Double message;
//    private City city;
//    private Integer cnt;
//    private java.util.List<Forecast> list = new ArrayList<>();
    private Movie movie;
//
//    public String getCod() {
//        return cod;
//    }
//
//    public void setCod(String cod) {
//        this.cod = cod;
//    }
//
//    public Double getMessage() {
//        return message;
//    }
//
//    public void setMessage(Double message) {
//        this.message = message;
//    }
//
//    public City getCity() {
//        return city;
//    }
//
//    public void setCity(City city) {
//        this.city = city;
//    }

    public Movie getMovie()
    {
        return movie;

    }

        public void setMovie(Movie movie) {
        this.movie = movie;
    }
//
//    public Integer getCnt() {
//        return cnt;
//    }
//
//    public void setCnt(Integer cnt) {
//        this.cnt = cnt;
//    }
//
//    public java.util.List<Forecast> getList() {
//        return list;
//    }
//
//    public void setList(java.util.List<Forecast> list) {
//        this.list = list;
//    }

}

Movie.java类

package org.example.domain;

import java.util.HashMap;
import java.util.Map;
import javax.annotation.Generated;

public class Movie {


    private String Response;
    private String Error;


    public String getMovieInfo() {
        return Response;
    }

    public void setMovieInfo(String name) {
        this.Response = Response;
    }


    public String getMovieInfo2() {
        return Error;
    }

    public void setMovieInfo2(String name) {
        this.Error = Error;
    }
}
在我削减之前这个人的项目(你需要使用vaadin插件来运行它) https://github.com/mstahv/consuming-rest-apis

重申我正在接受

javax.servlet.ServletException: com.vaadin.server.ServiceException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html; charset=utf-8, type=class org.example.domain.ForecastResponse, genericType=class org.example.domain.ForecastResponse.

当我尝试运行应用程序并尝试了许多解决方案时...但我认为这是因为我改变了一些因为我没有问题让这个人的原始文件运行

我已将当前版本上传到mirrorcreator(无法让git工作......感叹):https://www.mirrorcreator.com/files/KQF7SBBH/restapiexampletest1zip._links

谢谢你的阅读。我已经搜索了很多谷歌,但无法使用改变poms文件或其他任何建议来修复它....

0 个答案:

没有答案