- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当使用 Spring 的 JmsTemplate
发布到安全的 WebLogic JMS 队列时,我收到了一个 JmsSecurityException
。麻烦的是,我能够使用等效的非 Spring 代码成功发布。
下面是抛出的异常(假设目的地是QUEUE.IN
)。
org.springframework.jms.JmsSecurityException: Access denied to resource: type=<jms>, application=DistQueue-Module, destinationType=queue, resource=QUEUE.IN, action=send; nested exception is weblogic.jms.common.JMSSecurityException: Access denied to resource: type=<jms>, application=DistQueue-Module, destinationType=queue, resource=QUEUE.IN, action=send
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:291)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:534)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:526)
at com.company.jms.publisher.service.impl.JmsServiceImpl.sendMessage(JmsServiceImpl.java:34)
at com.company.jms.publisher.service.impl.JmsServiceImpl.publish(JmsServiceImpl.java:29)
at com.company.jms.publisher.controller.MainController.postIt(MainController.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
2013-11-07 19:26:56.506:WARN::Nested in org.springframework.jms.JmsSecurityException: Access denied to resource: type=<jms>, application=DistQueue-Module, destinationType=queue, resource=QUEUE.IN, action=send; nested exception is weblogic.jms.common.JMSSecurityException: Access denied to resource: type=<jms>, application=DistQueue-Module, destinationType=queue, resource=QUEUE.IN, action=send:
weblogic.jms.common.JMSSecurityException: Access denied to resource: type=<jms>, application=DistQueue-Module, destinationType=queue, resource=QUEUE.IN, action=send
at weblogic.jms.common.JMSSecurityHelper.checkPermission(JMSSecurityHelper.java:162)
at weblogic.jms.backend.BEDestinationSecurityImpl.checkSendPermission(BEDestinationSecurityImpl.java:74)
at weblogic.jms.backend.BEDestinationImpl.checkPermission(BEDestinationImpl.java:2513)
at weblogic.jms.backend.BEDestinationImpl.sendInitialize(BEDestinationImpl.java:1565)
at weblogic.jms.backend.BEDestinationImpl.send(BEDestinationImpl.java:2079)
at weblogic.jms.backend.BEDestinationImpl.wrappedSend(BEDestinationImpl.java:2051)
at weblogic.jms.backend.BEDestinationImpl.invoke(BEDestinationImpl.java:1539)
at weblogic.messaging.dispatcher.Request.wrappedFiniteStateMachine(Request.java:961)
at weblogic.messaging.dispatcher.DispatcherImpl.dispatchAsyncInternal(DispatcherImpl.java:140)
at weblogic.messaging.dispatcher.DispatcherImpl.dispatchAsync(DispatcherImpl.java:116)
at weblogic.messaging.dispatcher.Request.dispatchAsync(Request.java:1304)
at weblogic.jms.dispatcher.Request.dispatchAsync(Request.java:97)
at weblogic.jms.frontend.FEProducer.doDispatch(FEProducer.java:900)
at weblogic.jms.frontend.FEProducer.sendRetryDestination(FEProducer.java:1033)
at weblogic.jms.frontend.FEProducer.send(FEProducer.java:1435)
at weblogic.jms.frontend.FEProducer.invoke(FEProducer.java:1496)
at weblogic.messaging.dispatcher.Request.wrappedFiniteStateMachine(Request.java:961)
at weblogic.messaging.dispatcher.DispatcherServerRef.invoke(DispatcherServerRef.java:276)
at weblogic.messaging.dispatcher.DispatcherServerRef.handleRequest(DispatcherServerRef.java:141)
at weblogic.messaging.dispatcher.DispatcherServerRef.access$000(DispatcherServerRef.java:34)
at weblogic.messaging.dispatcher.DispatcherServerRef$2.run(DispatcherServerRef.java:112)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
忽略我已经删除了所有用于原始调试的池化代码这一事实,我使用以下配置和标准 JmsTemplate 来发送消息。
<beans:bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<beans:property name="environment">
<beans:props>
<beans:prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</beans:prop>
<beans:prop key="java.naming.provider.url">${jms.connectionUrl}</beans:prop>
<beans:prop key="java.naming.security.principal">${jms.username}</beans:prop>
<beans:prop key="java.naming.security.credentials">${jms.password}</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiTemplate" ref="jndiTemplate" />
<beans:property name="jndiName" value="${jms.connectionFactoryName}" />
</beans:bean>
<beans:bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiTemplate" ref="jndiTemplate" />
<beans:property name="jndiName" value="${jms.destinationName}" />
</beans:bean>
<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<beans:property name="connectionFactory" ref="connectionFactory" />
<beans:property name="defaultDestination" ref="destination" />
<beans:property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" />
<beans:property name="sessionTransacted" value="false" />
</beans:bean>
成功发布的非 Spring 代码的等效部分如下。
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
environment.put(Context.PROVIDER_URL, prop("jms.connectionUrl"));
environment.put(Context.SECURITY_PRINCIPAL, prop("jms.username"));
environment.put(Context.SECURITY_CREDENTIALS, prop("jms.password"));
Context context = new InitialContext(environment);
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(prop("jms.connectionFactoryName"));
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = (Destination) context.lookup(prop("jms.destinationName"));
MessageProducer producer = session.createProducer(destination);
connection.start();
TextMessage tm = session.createTextMessage(UUID.randomUUID().toString());
producer.send(tm);
从异常消息来看,它让我相信凭证没有在关键位置提供。 JNDI 查找成功,并且将任何属性(包括凭据)更改为无效值会导致在初始化期间抛出明显错误,远在尝试发布之前。
我最初认为可以使用 UserCredentialsConnectionFactoryAdapter
来解决这个问题,以确保在创建时提供凭据,但它导致了同样的错误。此外,对于上面的简单示例,我不需要使用它。
为了完整起见,这里是相关的 jmsTemplate 代码。
public void sendMessage(final String message) throws JmsException {
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage(message);
return textMessage;
}
});
}
最后但同样重要的是,我无法控制或访问我正在发布的 WebLogic 实例。我有一个联系人将审查日志以查看是否有任何重要线索,但这可能需要相当长的时间。
最佳答案
在对类似的 Spring 错误报告进行一些额外研究后,我发现了针对此问题的(非直观的)解决方法。我决定将此作为答案发布而不是删除问题,因为我希望它能在将来帮助其他人。
具体来说,我遇到了SPR-4720从 2008 年开始。John Bakar 推荐了一个似乎什么都不做的修复程序,但它确实解决了上述问题。
应用于我的项目,修复看起来像这样:
public class UserCredentialsConnectionFactoryAdapter extends org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter {
private JndiTemplate jndiTemplate;
public void setJndiTemplate(JndiTemplate jndiTemplate) {
this.jndiTemplate = jndiTemplate;
}
@Override
protected Connection doCreateConnection(String username, String password) throws JMSException {
wlFix();
return super.doCreateConnection(username, password);
}
/**
* Associate JNDI variables (user and password) with this thread for the
* benefit of the WL drivers.
*/
protected void wlFix() {
try {
@SuppressWarnings("unused")
InitialContext initialContext = new InitialContext(jndiTemplate.getEnvironment());
} catch (NamingException e) {
e.printStackTrace();
}
}
}
很奇怪吧?
总而言之,为了其他人的引用,我的Spring配置现在是这样的:
<beans:bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<beans:property name="environment">
<beans:props>
<beans:prop key="java.naming.factory.initial">${jms.jndiFactory}</beans:prop>
<beans:prop key="java.naming.provider.url">${jms.connectionUrl}</beans:prop>
<beans:prop key="java.naming.security.principal">${jms.username}</beans:prop>
<beans:prop key="java.naming.security.credentials">${jms.password}</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiTemplate" ref="jndiTemplate" />
<beans:property name="jndiName" value="${jms.connectionFactoryName}" />
</beans:bean>
<beans:bean id="connectionFactoryAdapter" class="com.company.jms.publisher.UserCredentialsConnectionFactoryAdapter">
<beans:property name="jndiTemplate" ref="jndiTemplate" />
<beans:property name="targetConnectionFactory" ref="connectionFactory" />
<beans:property name="username" value="${jms.username}" />
<beans:property name="password" value="${jms.password}" />
</beans:bean>
<beans:bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<beans:property name="targetConnectionFactory" ref="connectionFactoryAdapter" />
<beans:property name="sessionCacheSize" value="10" />
</beans:bean>
<beans:bean id="destinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
<beans:property name="jndiTemplate" ref="jndiTemplate" />
</beans:bean>
<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<beans:property name="connectionFactory" ref="cachingConnectionFactory" />
<beans:property name="destinationResolver" ref="destinationResolver" />
<beans:property name="defaultDestinationName" value="${jms.publish.destinationName}" />
<beans:property name="sessionAcknowledgeModeName" value="AUTO_ACKNOWLEDGE" />
<beans:property name="sessionTransacted" value="false" />
</beans:bean>
我愿意悬赏给任何能够权威地(没有猜测)解释为什么创建一个虚拟 InitialContext
并且什么也不做的人解决了没有正确提供凭据的问题到 WLS。
关于java - org.springframework.jms.JmsSecurityException : Access denied to resource: type=<jms>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19849766/
刚开始处理Maven和Spring。当我尝试创建DAO和ResultSet然后运行应用程序时,抛出errors: Error:(4, 31) java: package org.springframe
问题: Error:(15, 10) java: cannot find symbol symbol: class SpringRunner Error:(16, 2) java: cannot
我正在尝试构建这个 RESTful 服务示例:https://spring.io/guides/gs/rest-service/GreetingController.java 的导入没有错误: pac
如果我尝试向构造函数注入(inject) Facebook 参数,我将尝试使用 facebook api 使用 spring + thymeleaf + hibernate 创建 Facebook 应
如何解决Spring中Bean的自动连接歧义?我们有一个 Dessert 接口(interface),并且有实现该接口(interface)(Dessert)的三种不同的甜点(Bean)。 今天的甜点
请问为什么我的 pom.xml 文件中会出现此错误 Missing artifact org.springframework:spring-context:jar:${org.springframew
让 gradle 构建正常工作( from a previous question related to this one ),安迪·威尔金森(Andy Wilkinson)为我回答,没有问题。正在为
我正在 tomcat 7 中开发网站(spring 3.1.1),但出现错误 ERROR: org.springframework.web.context.ContextLoader - Contex
我在将航类信息保存到 mysql 数据库时遇到错误。请帮助我下面是我的代码: 我已经尝试了所有方法,添加模式和这么多 它不会从字符串转换为日期 控制台日志 2020-05-12 13:19:21.04
我使用intellij创建了一个小型java应用程序,后来我使用“添加框架支持”选项将该项目更新为Maven项目。当我厌倦了在项目上添加 spring jar 文件时,出现以下错误:“没有为 org.
我尝试使用 org.springframework.data.mongodb.core.MongoOperations 从 mongo 集合中查询记录。我在 CompanyTemplRepoImpl
我尝试将 Spring4 与 Hibernate5 一起使用,但出现此错误: org.springframework.orm.jpa.EntityManagerHolder cannot be cas
我是这个论坛的新手。我正在尝试使用 spring 3.2.6 和 tomcat 7.0 制作一个应用程序。我已将所有必需的 jar 添加到 WEB-INF/lib 文件夹中。 DispatcherSe
我在 maven 架构中使用 Spring 框架 4.0.1.RELEASE、OAuth Security 2.0.7.RELEASE,当我编译代码时,出现以下错误。 SEVERE: Exceptio
我正在使用以下指令开发 CRUD Web 应用程序: https://www.javaguides.net/2019/02/spring-boot-2-angular-7-crud-example-t
这个问题已经有答案了: what is the difference in org.springframework.web.servlet.ModelAndView vs org.springfram
我正在尝试将 hibernate 与 spring boot 一起使用。但我收到此错误:org.springframework.orm.jpa.EntityManagerHolder 无法转换为 or
我尝试创建简单的用户登录和注册页面。但我无法使用服务方法创建用户。我有创建新用户的服务。 @Service public class LocalUserDetailsService implement
我用 STS、Roo 和 GWT 创建了一个新项目,并尝试包含 Spring Security。 从那时起,我收到以下错误。有没有人知道出了什么问题?! org.springframework.bea
这些是我正在使用的版本和依赖项 我怀疑版本需要更改但更改为什么,我不确定 springCore : '5.3.3', springjdbc
我是一名优秀的程序员,十分优秀!