我写了一个webservice并试图抛出我的自定义异常,但我收到错误请帮我解决.
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService(name = "WebService")
public class WebServiceTest {
public String sayHello(String name) throws InvalidInputException {
throw new InvalidInputException("I am testing", null);
}
public static void main(String[] args) {
WebServiceTest server = new WebServiceTest();
Endpoint endpoint = Endpoint.publish(
"http://localhost:9191/webServiceTest", server);
}
}
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
@XmlType(name = "InputMessageValidationFaultType")
public class FaultBean {
@XmlAttribute
protected String msg;
public String getMsg() {
return msg;
}
public void setMsg(String value) {
this.msg = value;
}
}
import javax.xml.ws.WebFault;
@WebFault(faultBean …Run Code Online (Sandbox Code Playgroud) 我们使用了类JAXWSProperties从com.sun.*包中的代码,以这样设置超时属性:
import com.sun.xml.internal.ws.developer.JAXWSProperties;
...
Map<String, Object> ctxt = ((BindingProvider) port).getRequestContext();
ctxt.put(JAXWSProperties.CONNECT_TIMEOUT, 10000);
Run Code Online (Sandbox Code Playgroud)
它在本地Eclipse中编译良好,但不在连续集成系统上编译(两者都使用JDK 1.6).通过研究这个问题,我了解到com.sun.*应该避免使用这个包.
所以我的问题是:
JAXWSProperties?我正在寻找一个与Eclipse一起使用的JAX-WS教程.我特别想要的是一些使用自上而下的方法,你有一个wsdl文件的url并运行wsgen来生成你的存根.
谢谢!
我按照这里的说明在 JDK v1.6.0_31之上正确安装了最新的JAX-WS版本(2.2.6)(即将JAX-WS发行版中的jaxws-api.jar和jaxb-api.jar复制到我的$ {JAVA_HOME}/lib/endorsed目录).从Eclipse内部我可以正确运行wsimport ant任务,生成的代码在以下注释中给出了一个版本标记:
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.6b21
* Generated source version: 2.2
*
*/
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是生成的客户端代码显示错误导致我相信编译器仍在使用JAX-WS版本2.1:
The constructor Service(URL, QName, WebServiceFeature[]) is undefined
Run Code Online (Sandbox Code Playgroud)
和
The attribute required is undefined for the annotation type XmlElementRef
Run Code Online (Sandbox Code Playgroud)
我尝试在启动Eclipse时显式设置-Djava.endorsed.dir arg,我也尝试在Eclipse-> Preferences-> Java-> InstalledJREs下设置这个arg,但这些都没有帮助.我的wsimport ant任务类路径被定义为查看JAX-WS 2.2.6 jar.我也试过设置我的项目构建路径来拉入2.2.6罐子.似乎没什么用.我错过了什么吗?
我必须连接到一个实现效果不佳的服务器,它只能理解Content-Type(资本-T)而不是Content-type.我怎样才能让我的JAX-WS客户端发送Content-Type?
我试过了:
Map<String, List<String>> headers = (Map<String, List<String>>)
((BindingProvider)port).getRequestContext().get(MessageContext.HTTP_REQUEST_HEADERS);
Run Code Online (Sandbox Code Playgroud)
不过headers是null.我究竟做错了什么?
在Web服务中进行身份验证和授权的最佳方法是什么?
我正在开发一组Web服务,需要基于角色的访问控制.使用metro - SOAP,简单的java而不使用EJB.
至今:
我想我可以使用SOAP处理程序拦截所有消息,并使用消息附带的一些会话标识符令牌在hander中执行授权控制,该令牌可以与保存在数据库中的标识符匹配,登录Web方法.
编辑:
我还有一些问题:
编辑2
因为@ ag112答案:
我正在使用Glassfish.
我使用WS-Policy和WS-Security来加密和签名消息.使用相互证书身份验证.我想在应用程序之间补充此消息级别的安全性,同时在消息级别对用户进行身份验证和授权.
我只是开发服务,我几乎不知道客户,只是他们可以用不同的语言创建.
在这一点上,我认为最重要的是做我需要做的事情来验证和验证用户,我是客户端应用程序最简单的实现方式.
我正在使用Java 6来了解有关Web服务(JAX-WS)的更多信息.我还读到JAX-WS最新版本可用于Metro,即如果您不使用JDK6并计划使用JAX-WS,则可以使用Metro.
我想知道我的JDK附带了哪个版本的JAX-WS?我正在使用jdk1.6.0_22.
我正在使用JAX-WS进行Web服务.
每当我使用char作为方法参数时,我将它作为xsd中的unsignedShort(Focus on weatherLetter).
这是宣言:
@WebMethod
public boolean setWXtatus(
@WebParam(name = "weatherLetter") char weatherLetter,
@WebParam(name = "weatherDigit") int weatherDigit,
@WebParam(name = "cloudCover") int cloudCover,
@WebParam(name = "cloudBaseInHundredsOfFeet") int cloudBaseInHundredsOfFeet,
@WebParam(name = "pressureInHg") int pressureInHg,
@WebParam(name = "visibilityInKm") int visibilityInKm,
@WebParam(name = "windSpeed") int windSpeed,
@WebParam(name = "windDirection") int windDirection,
@WebParam(name = "lastUpdateHour") int lastUpdateHour,
@WebParam(name = "lastUpdateMin") int lastUpdateMin
)
Run Code Online (Sandbox Code Playgroud)
这是我得到的类型映射:
<xs:complexType name="setWXStatus">
<xs:sequence>
<xs:element name="weatherLetter" type="xs:unsignedShort" minOccurs="0"/>
<xs:element name="weatherDigit" type="xs:int"/>
<xs:element name="cloudCover" type="xs:int"/>
<xs:element name="cloudBaseInHundredsOfFeet" type="xs:int"/>
<xs:element name="pressureInHg" type="xs:int"/> …Run Code Online (Sandbox Code Playgroud) 对于具有多个Web服务(多个WSDL)的项目,我们使用自上而下的方法.每个Web服务都需要设置为单独的项目,并作为单独的战争部署.
问题是WSDL共享一些常见的.xsd文件.目前,如果我们为每个WSDL运行wsimport,则每个Web服务项目中都会复制常见的JAXB类.
理想情况下,我们希望在公共共享项目中单独生成JAXB类,然后在每个Web服务项目中重用JAXB类项目,但wsimport不提供跳过JAXB类生成或指定其他位置的选项对于JAXB类.
关于如何在不同的JAX-WS Web服务端点之间共享JAXB类的任何想法?
我正在寻找javax.xml.soap除Sun SAAJ之外的替代SOAP()实现.原因是因为我想在IBM JDK 5驱动的Tomcat AS上部署JAX-WS WebService,但是已知问题是Sun SAAJ实现依赖于重新分配的Xerces类(请参阅Ref Impl不能与IBM JDK和SAAJ测试一起使用)案例不再适用于IBM的SDK),唯一的出路就是使用自定义Maven配置文件来实现com.sun.xml.parsers:jaxp-ri:
<profiles>
<profile>
<id>pre-jdk5-profile</id>
<activation>
<jdk>(,1.4]</jdk>
</activation>
<dependencies>
<dependency>
<groupId>com.sun.xml.parsers</groupId>
<artifactId>jaxp-ri</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)
我想删除此配置文件,只需将SOAP实现替换为适用于任何地方的实现.
我认为供应商SOAP实现可能附带Apache Axis/Apache CXF(基于IBM SOAP4J)或JBoss AS - 请根据我的偏好提供信息:
参考文献: