当前位置: 首页 > 知识库问答 >
问题:

在Jersey 1.17中指定JAXB 2上下文

刘承悦
2023-03-14

我在服务器端使用Jersey 1.17来处理REST请求,并使用JAXB2来解开XML请求内容。

语境

这是我使用的泽西方法。MyDTO类使用@XmlRootelement注释(否则,我需要用JAXBElement类型定义参数)。

 @Path("/myService")
 @POST
 @Consumes(MediaType.APPLICATION_XML)
 public void myService(MyDTO dto) throws Exception
 {              
    // Shouldn't get this far if the XML content in the request was invalid
    System.out.println(dto);
 }
public class UnmarshallerValidationEventHandler implements ValidationEventHandler {

        @Override
        public boolean handleEvent(ValidationEvent event) {
            // This indicates JAXB that it should continue processing only if the
            // severity level is less than error. NOTE: validation event constants
            // go in ascending order in level of severity(i.e., 0 WARNING, 1: ERROR, 2 :FATAL_ERROR)
            return event.getSeverity() < ValidationEvent.ERROR;
        }

    }

或者,如果我的应用程序只在Jersey方法中使用JAXB,那么为JVM实例全局定义一个特定的JAXBContext将是一个不错的选择。怎么能做到呢?

共有1个答案

佘单鹗
2023-03-14

Jersey用户指南在使用自定义JAXBContext一章中涵盖了这一点。基本上,您需要提供ContextResolver ,例如:

@Provider
public class PlanetJAXBContextProvider implements ContextResolver<JAXBContext> {
    private JAXBContext context = null;

    public JAXBContext getContext(Class<?> type) {
        if(type != Planet.class)
            return null; // we don't support nothing else than Planet

        if(context == null) {
            try {
                context = JAXBContext.newInstance(Planet.class);
            } catch (JAXBException e) {
                // log warning/error; null will be returned which indicates that this
                // provider won't/can't be used.
            }
        }
        return context;
    }
}

您可以看到在storage-service示例项目中使用的示例(请参见JAXBContextResolver)。

注意:除了ContextResolver ,您还可以提供ContextResolver 或/和ContextResolver

 类似资料:
  • 问题内容: 我试图确保我的Rhino脚本(在Java 6下运行)很严格,以便如果脚本开发人员拼错了一个表达式,我希望抛出一个异常。当前发生的情况是该表达式仅计算为“未定义”。 根据Mozilla org https://developer.mozilla.org/en/New_in_Rhino_1.6R6的介绍,现在有一些功能可以在上下文中进行严格检查。我找不到一个可行的例子。 到目前为止,我所做

  • 我有一个作为WAR部署的spring boot web应用程序。现在,当我将它部署到我的Tomcat7服务器时,它使用war文件的名称作为上下文,例如/myArtifactid-1.5.4.snapshot/。我想指定上下文路径,但是 似乎只适用于嵌入式Tomcat。我添加了一个meta-inf/context.xml,其中仅包含以下内容 但这并没有起到任何作用。

  • 我在Linux(Ubuntu)机器上运行IntelliJ IDEA 2017.1.6 Pro,它不会让我为任何Java项目选择SDK。 我试着指定位置: /usr/lib/jvm/ /usr/lib/jvm/java-11-openjdk-amd64/ /usr/lib/jvm/java-8-openjdk-amd64/ /usr/lib/jvm/openjdk-11/ /usr/lib/jvm/

  • 问题内容: 因此,如果某些表缺少主键,则innodb的行为可能会导致问题。 因此,对于Hibernate,我正在寻找一个键来指定@ElementCollection表上的主键,并使用Set作为基础数据结构。 我找到了一种在地图上具有主键的方法,但这有点奇怪,因为我不需要地图。 我还找到了与@Embeddable相关的答案,但是我不需要那种复杂性。我在实体中使用Set或Set作为数据结构。 知道如何

  • 我试图从我的代码库生成数据来填充OpenAPI 3.0输入。 我有一个restendpoint,用于将文件上载到服务器。 我有一个表单作为聚合vaadin上传组件,用于上传文件。路径是,表单参数名是。表单正确地将文件上传到服务器,所以这不是问题所在。 服务器endpoint使用超文本标记语言窗体规范中的XQRS RestXQ上传文件来实现。 我正在尝试为多部分文件上传的OpenAPI 3.0UI创

  • 这里有一个项目,我需要在WPF应用程序中自定义上下文菜单,其中将在所有MenuItems的底部放置一个按钮。 但是,如果我要通过XAML添加按钮,它将作为集合中的另一项出现在上下文菜单中,鼠标移过高亮显示将作用于它。 我希望有一个上下文菜单调优到网格样的样式,这样我就可以自定义样式下的它。 有什么想法可以实现这一点(最好是在XAML中)吗?