当前位置: 首页 > 面试题库 >

如何使用Jersey JSON POJO支持?

巩阳秋
2023-03-14
问题内容

我有一个对象,希望在JSON中作为RESTful资源使用。我已经启用了Jersey的JSON POJO支持(在web.xml中):

<servlet>  
    <servlet-name>Jersey Web Application</servlet-name>  
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <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>

但是,当我尝试访问资源时,出现以下异常:

SEVERE: A message body writer for Java type, class com.example.MyDto, and MIME media type, application/json, was not found
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException
...

我要提供的类并不复杂,它只有一些公共final字段和一个设置所有这些的构造函数。字段是所有字符串,基元,与此类似的类或它们的列表(我尝试使用普通列表而不是通用List
,但无济于事)。有谁知道给什么?谢谢!

Java EE 6

泽西岛1.1.5

GlassFish 3.0.1


问题答案:

Jersey-
json具有JAXB实现。收到该异常的原因是因为您没有注册Provider,更具体地说是未注册MessageBodyWriter。您需要在提供商中注册适当的上下文:

@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
    private final static String ENTITY_PACKAGE = "package.goes.here";
    private final static JAXBContext context;
    static {
        try {
            context = new JAXBContextAdapter(new JSONJAXBContext(JSONConfiguration.mapped().rootUnwrapping(false).build(), ENTITY_PACKAGE));
        } catch (final JAXBException ex) {
            throw new IllegalStateException("Could not resolve JAXBContext.", ex);
        }
    }

    public JAXBContext getContext(final Class<?> type) {
        try {
            if (type.getPackage().getName().contains(ENTITY_PACKAGE)) {
                return context;
            }
        } catch (final Exception ex) {
            // trap, just return null
        }
        return null;
    }

    public static final class JAXBContextAdapter extends JAXBContext {
        private final JAXBContext context;

        public JAXBContextAdapter(final JAXBContext context) {
            this.context = context;
        }

        @Override
        public Marshaller createMarshaller() {
            Marshaller marshaller = null;
            try {
                marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            } catch (final PropertyException pe) {
                return marshaller;
            } catch (final JAXBException jbe) {
                return null;
            }
            return marshaller;
        }

        @Override
        public Unmarshaller createUnmarshaller() throws JAXBException {
            final Unmarshaller unmarshaller = context.createUnmarshaller();
            unmarshaller.setEventHandler(new DefaultValidationEventHandler());
            return unmarshaller;
        }

        @Override
        public Validator createValidator() throws JAXBException {
            return context.createValidator();
        }
    }
}

这将@XmlRegistry在提供的程序包名称中查找,这是一个包含带@XmlRootElement注释的POJO 的程序包。

@XmlRootElement
public class Person {

    private String firstName;

    //getters and setters, etc.
}

然后在同一包中创建一个ObjectFactory:

@XmlRegistry
public class ObjectFactory {
   public Person createNewPerson() {
      return new Person();
   }
}

通过@Provider注册,Jersey应该在您的资源中为您编组提供便利:

@GET
@Consumes(MediaType.APPLICATION_JSON)
public Response doWork(Person person) {
   // do work
   return Response.ok().build();
}


 类似资料:
  • 问题内容: 我有一个使用restify模块创建的REST api,我想允许跨域资源共享。最好的方法是什么? 问题答案: 您必须将服务器设置为设置跨源标头。不知道是否有内置的使用功能,所以我写了自己的功能。 我是从本教程中找到的。http://backbonetutorials.com/nodejs-restify-mongodb- mongoose/

  • 问题内容: 最近,我们开始针对我们处理的每个故事使用功能分支。它们尽可能独立,然后由我们的项目经理决定由哪些故事组成发布。这意味着我们确实知道故事最初制作的确切顺序。 在Flyway中是否有处理此问题的标准方法?我已经阅读了FAQ,它讨论了如何对生产数据库进行的更改是线性的,这是正确的。但是,我不确定团队成员在功能分支上工作时如何决定要进行迁移的版本号。另外,在发布之前合并到集成分支和主服务器时,

  • 我怎么才能让它起作用呢?类似的攻略我看了很多,唉。使用高于23.1.1的支持库多次失败。 第三步:当然,我试了第一个gradlew:App:Dependenics等,但那个一直崩溃。是的,我使用JDK1.8。它是一个注册的bug,从夏天开始一直没有解决。 对了...Android、支持包、浓缩咖啡都是谷歌的?

  • 到底什么是宏呢? 我们把那些能自动执行某种操作的命令统称为“宏”。   宏也是一种操作命令,它和菜单操作命令都是一样的,只是它们对数据库施加作用的时间有所不同,作用时的条件也有所不同。菜单命令一般用在数据库的设计过程中,而宏命令则用在数据库的执行过程中。菜单命令必须由使用者来施加这个操作,而宏命令则可以在数据库中自动执行。   在OFFICE中,有很多种基本宏操作,这些基本操作还可以组合成很多其他

  • 我试图添加一个按钮点击涟漪动画。我确实喜欢下面的内容,但它需要从版本到21。 涟漪xml 按钮 我想让它向下兼容设计库。 如何做到这一点?

  • 我正在使用Spring 5 WebClient。我想知道是否可以将其配置为使用HTTP代理,或者是否有方法更改其默认配置以使用HTTP代理。