4.2. 其他更改
除了软件包命名空间更改外,为较早 EE 版本编写的应用程序可能需要适应 Jakarta EE 10 中包含的多个规格中所做的更改。以下小节描述了这些更改,主要是删除较长的 API 元素。
在以下部分中,对于已删除使用 javax 命名空间的 API 元素的任何实例,在 Jakarta EE 9 中使用的 jakarta 命名空间中进行了等同的删除。因此,如果您更新了应用程序,将 javax 命名空间替换为 jakarta,假设提到 javax 的项目适用于您的应用程序。
4.2.1. Jakarta 上下文和依赖注入 Bean 发现 复制链接链接已复制到粘贴板!
根据 CDI 4.0 spec 更改备注,在带有空 beans.xml 文件的部署中发现上下文和依赖注入或 CDI Bean 的默认行为已从 all 改为 annotated。这意味着,CDI 只发现一个带有 bean 定义注解的 部署类。如果使用 Bean 的所有应用程序类都有这样的注解,则此 CDI 更改不会影响。否则,当 CDI 找不到提供特定 bean 的类型时,应用程序部署可能会失败。
如果您的应用程序受这个更改的影响,则有几个选项:
-
将
beans.xml文件留空,但向需要它的所有类添加一个 bean 定义注解。 -
将类保持不变,但将
beans.xml文件从空更改为包含以下内容: <beans bean-discovery-mode="all"></beans> -
将应用保持不变,但更改服务器的 weld 子系统配置,以将空
beans.xml文件的处理恢复回 JBoss EAP 7 行为。此设置会影响服务器上的所有部署。例如,使用 CLI:/subsystem=weld:write-attribute (name=legacy-empty-beans-xml-treatment,value=true)
4.2.2. CDI API 更改 复制链接链接已复制到粘贴板!
Jakarta 上下文和依赖注入 4.0 删除了以下已弃用的 API 元素:
-
javax.enterprise.inject.spi.Bean.isNullable ()方法已被删除。现在,这个方法在很多年内一直返回false,因此调用它的应用程序可以将调用替换为false或移除任何分支逻辑,并只保留false分支的内容。 -
javax.enterprise.inject.spi.BeanManager.createInjectionTarget (AnnotatedType)方法已被删除。将此方法调用替换为BeanManager.getInjectionTargetFactory (AnnotatedType),并使用返回的工厂来创建注入目标。如需更多信息,请参阅 Jakarta 上下文和依赖注入规格中的类包含注入目标。 -
javax.enterprise.inject.spi.BeanManager.fireEvent (Object,Annotation)方法已被删除。使用BeanManager.getEvent ()作为指向类似 API 的入口点。如需更多信息, 请参阅 Jakarta 上下文和依赖注入规格中的查找事件。 -
javax.enterprise.inject.spi.BeforeBeanDiscovery.addAnnotatedType (AnnotatedType)方法已被删除。如果您的应用程序调用此方法,您可以将它替换为BeforeBeanDiscovery.addAnnotatedType (AnnotatedType,(String) null)。
4.2.3. Jakarta Enterprise Beans 复制链接链接已复制到粘贴板!
Java SE 14 删除了 java.security.Identity 类,因此其使用量已从 Jakarta Enterprise Beans 4.0 API 中删除。
-
弃用的
javax.ejb.ejbContext.getCallerIdentity() 方法已被删除。您可以使用EJBContext.getCallerPrincipal (),这将返回java.security.Principal。 -
弃用的
javax.ejb.ejbContext.isCallerInRole (Identity role)方法已被删除。您可以使用EJBContext.isCallerInRole (String roleName)替代。 -
Jakarta XML RPC 规范已从 Jakarta EE 10 Full Platform 中删除,因此删除了 returned
Context.getMessageContext 方法。javax.xml.rpc.handler.MessageContext.getMessageContext 的 javax.ejb.Session -
Jakarta XML RPC 规范在 Jakarta EE 8 中是可选的,Red Hat JBoss EAP 7 不支持它。此规格的任何用法都会抛出
IllegalStateException,因此此 EJB API 更改不会影响 JBoss EAP 7 上运行的任何现有应用。 -
弃用的
javax.ejb.ejbContext.getEnvironment ()方法已被删除。使用 JNDI 命名上下文java:comp/env来访问企业 bean 的环境。
4.2.4. Jakarta Expression Language 复制链接链接已复制到粘贴板!
删除了错误拼写 javax.el.MethodExpression.isParmetersProvided () 方法。您可以使用 MethodExpression.isParametersProvided () 替代。
4.2.5. Jakarta JSON 绑定 复制链接链接已复制到粘贴板!
默认情况下,使用 jakarta.json.bind.annotation.JsonbCreator 注解标注的类型不需要 JSON 内容中的所有参数都可用。如果被解析的 JSON 缺少其中一个参数,则将使用默认值。可以通过调用 jakarta.json.bind.JsonbConfig ().withCreatorParametersRequired (true) 来开启需要 JSON 中的所有参数的 EE 8 行为。
4.2.6. jakarta Faces 复制链接链接已复制到粘贴板!
Jakarta Faces 4.0 中删除了以下已弃用的功能。
4.2.6.1. jakarta Faces 和 Java Server 页 复制链接链接已复制到粘贴板!
Jakarta Server Pages (JSP)支持在 Jakarta Faces 2.0 及更新的版本中已弃用。Jakarta Faces 4.0 中删除了对 JSP 的支持。Facelets 取代了 JSP 作为首选视图定义语言(VDL)。使用 JSP 用于 Faces 视图的应用程序可以使用 Facelet 修改。您可以通过将 FacesServlet 映射到 web.xml 中的 Ifjsp 后缀来识别应用程序。
4.2.6.2. Faces Managed-Beans 复制链接链接已复制到粘贴板!
在 Faces 4.0 中删除了特定于 Jakarta Faces 的 managed-bean 概念,用于 Jakarta 上下文和依赖注入(CDI) Bean。使用 Faces managed-beans (即,使用 javax.faces.bean.ManagedBean 注解标注的类)或在 faces-config.xml的 managed-bean 元素中引用的类可能需要进行以下更改:
-
使用
javax.faces.bean.ManagedBean标注的类在faces-config.xml中的 managed-bean 元素中引用的类应该被注解为jakarta.inject.Named,以及faces-config.xml中的 managed-bean 元素应该被删除。 -
使用
javax.faces.bean.ManagedProperty注解标注的成员应该使用jakarta.faces.annotation.ManagedProperty,以及jakarta.inject.Inject注解。要获得类似于旧的javax.faces.bean.ManagedBean (name="foo", eager=true)的启动语义,请添加public void xxx (@Observes jakarta.enterprise.event.Startup event)方法或公共 void xxx (@Observes @Initialized (ApplicationScoped.class)对象上下文方法。jakarta.enterprise.event.Startup选项是 CDI 4.0 中的新选项。 -
使用
javax.faces.bean.ApplicationScoped注解应该被jakarta.enterprise.context.ApplicationScoped替换。 -
使用
javax.faces.bean.CustomScoped注解应该替换为 CDI 自定义范围和jakarta.enterprise.context.spi.Context。如需了解更多详细信息 ,请参阅 CDI 4.0 规格中定义新的范围类型 和 上下文接口。 -
使用
javax.faces.bean.NoneScoped注解应该替换为jakarta.enterprise.context.Dependent,它是 CDI 内置范围,具有大约类似语义。 -
使用
javax.faces.bean.RequestScoped注解应该被jakarta.enterprise.context.RequestScoped替换。 -
使用
javax.faces.bean.SessionScoped注解应该被jakarta.enterprise.context.SessionScoped替换。
4.2.6.3. 其他 Faces API 更改 复制链接链接已复制到粘贴板!
javax.faces.bean.ViewScoped 注解已被删除。您可以使用 jakarta.faces.view.ViewScoped 替代。
javax.faces.view.facelets.ResourceResolver 和 javax.faces.view.facelets.FaceletsResourceResolver 注解已被删除。对于应用程序中的任何 ResourceResolver,实施 jakarta.faces.application.ResourceHandler 接口,并在 faces-config.xml 中的 application/resource-handler 元素中注册实现的完全限定类名称。
4.2.7. Jakarta Servlet 复制链接链接已复制到粘贴板!
Jakarta Servlet 6.0 删除了在 Servlet 5.0 及更早版本中被弃用的数字 API 类和方法,主要在 Servlet 2.x 版本中。
javax.servlet.SingleThreadModel marker 接口已被删除,且实施此接口的 servlets 必须删除 interface 声明,并确保 servlet 代码正确保护状态,以及针对并发访问的其他资源访问。例如,通过避免使用实例变量或同步代码访问资源的块。但是,建议开发人员不同步 服务 方法(或 doGet 和 doPost 等方法),因为此类同步性能会降低此类同步的影响。
javax.servlet.http.HttpSessionContext 接口已被删除,以及 javax.servlet.http.HttpSession.getSessionContext () 方法。由于 Servlet 2.1 需要它的实现,因此此界面没有用例,因为规格不需要提供任何可用的数据。
javax.servlet.http.HttpUtils 实用程序类已被删除。应用程序应使用 ServletRequest 和 HttpServletRequest 接口,而不是以下方法:
-
parseQueryString (String s)andparsePostData (int len, ServletInputStream in)- UseServletRequest.getParameterMap ().如果应用程序需要区分查询字符串参数和请求正文参数,应用程序必须通过解析查询字符串本身来实现该代码。 -
getRequestURL (HttpServletRequest req)- UseHttpServletRequest.getRequestURL ().
另外,以下各种方法和构造器已被删除:
| class/Interface | 删除 | 使用 Instead |
|---|---|---|
| javax.servlet.ServletContext | getServlet (String name) | 没有替换方案 |
| getServlets() | 没有替换方案 | |
| getServletNames() | 没有替换方案 | |
| log (Exception exception, String msg) | log (String message, Throwableable) | |
| javax.servlet.ServletRequest | getRealPath (String path) | ServletContext.getRealPath(String path) |
| javax.servlet.ServletRequestWrapper | getRealPath (String path) | ServletContext.getRealPath(String path) |
| javax.servlet.UnavailableException | getServlet() | 没有替换方案 |
| UnavailableException (Servlet servlet, String msg) | UnavailableException (String) | |
| UnavailableException (int seconds, Servlet servlet, String msg) | UnavailableException (String, int) | |
| javax.servlet.http.HttpServletRequest | isRequestedSessionIdFromUrl() | isRequestedSessionIdFromURL() |
| javax.servlet.http.HttpServletRequestWrapper | isRequestedSessionIdFromUrl() | isRequestedSessionIdFromURL() |
| javax.servlet.http.HttpServletResponse | encodeUrl (String url) | encodeURL (String url) |
| encodeRedirectUrl(String url) | encodeRedirectURL (String url) | |
| setStatus (int sc, String sm) | sendError (int, String) | |
| javax.servlet.http.HttpServletResponseWrapper | encodeUrl (String url) | encodeURL (String url) |
| encodeRedirectUrl(String url) | encodeRedirectURL (String url) | |
| setStatus (int sc, String sm) | sendError (int, String) | |
| javax.servlet.http.HttpSession | getValue (String name) | getAttribute (String name) |
| getValueNames() | getAttributeNames() | |
| putValue (String name, Object value) | setAttribute (String name, Object value) | |
| removeValue (String name) | removeAttribute (String name) |
4.2.8. jakarta Soap with Attachments 复制链接链接已复制到粘贴板!
删除了对通过 jaxm.properties 文件进行供应商查找的支持。
弃用的 javax.xml.soap.SOAPElementFactory 类已被删除。使用 jakarta.xml.soap.SOAPFactory 创建 SOAPElements。
| SOAPElementFactory 方法 | SOAPFactory 等效 |
|---|---|
| newInstance() | newInstance() |
| create (Name) | createElement(Name) |
| create (String) | createElement (String) |
| create (String, String, String) | createElement (String, String, String) |
4.2.9. Jakarta XML 绑定 复制链接链接已复制到粘贴板!
xml 绑定文件中使用的 XML 命名空间已更改。http://java.sun.com/xml/ns/jaxb 命名空间应该替换为 https://jakarta.ee/xml/ns/jaxb。
弃用的 javax.xml.bind.Validator 接口已被删除,因为 关联的 javax.xml.bind.JAXBContext.createValidator () 方法。要验证 marshalling 和 unmarshalling 操作,请为 jakarta.xml.validation.Schema 提供 。
javax.xml.validation.Schema.bind.Marshaller.setSchema (Schema)
删除了对与 JAXB 1.0 兼容的支持。
JAXBContext 实施查找算法中的一些已弃用步骤已被删除。通过 jaxb.properties 文件、javax.xml.bind.context.factory 或 jakarta.xml.bind.JAXBContext 属性和 /META-INF/services/javax.xml.bind.JAXBContext 资源文件搜索实施类名称已被丢弃。有关当前实现发现算法的更多信息,请参阅 Jakarta XML Binding 4.0 规范。
javax.xml.bind.Marshaller 接口中的多个方法的通用要求已更改,如下所示:
| Jakarta XML Binding 2.3 / 3.0 | Jakarta XML Binding 4.0 |
|---|---|
| <a extends XmlAdapter> void setAdapter (A adapter) | <a extends XmlAdapter<?, ?>> void setAdapter (A adapter) |
| <a extends XmlAdapter> void setAdapter (Class<A> type, A adapter) | <a extends XmlAdapter<?, ?>> void setAdapter (Class<A> type, A adapter) |
| <a extends XmlAdapter> A getAdapter (Class<A> type) | <a extends XmlAdapter<?, ?>> A getAdapter (Class<A> type) |
除了 Jakarta XML Binding API 的更改外,实施库 EAP 8 中还有显著的软件包名称更改,这可能会影响访问实施库的一些应用:
-
com.sun.xml.bind软件包中的任何使用都应替换为org.glassfish.jaxb.runtime软件包中的类。com.sun.xml.bind的子软件包中的类应替换为对应的org.glassfish.jaxb.runtime子软件包中的类。 -
对于
jakarta.xml.bind.Marshaller属性设置,将属性常量名称从com.sun.xml.bindAPPEND改为org.glassfish.jaxbBYO。例如,marshaller.setProperty ("com.sun.xml.bind.namespacePrefixMapper", mapper)变为marshaller.setProperty ("org.glassfish.jaxb.namespacePrefixMapper", mapper)。