使用场景
我们已经实现了一个Web服务,我们的Web前端开发人员在内部使用(通过php api)来显示产品数据.在网站上,用户输入内容(即查询字符串).在内部,网站通过api调用服务.
注意:我们使用restlet,而不是tomcat
原始问题
Firefox 3.0.10似乎尊重浏览器中选定的编码,并根据所选编码对URL进行编码.这确实导致ISO-8859-1和UTF-8的不同查询字符串.
我们的网站转发来自用户的输入并且不转换它(它应该),因此它可以通过使用包含德语变音符号的查询字符串调用web服务的api来调用服务.
即查询部分看起来像
...v=abcädef
Run Code Online (Sandbox Code Playgroud)
如果选择"ISO-8859-1",则发送的查询部分看起来像
...v=abc%E4def
Run Code Online (Sandbox Code Playgroud)
但是如果选择"UTF-8",则发送的查询部分看起来像
...v=abc%C3%A4def
Run Code Online (Sandbox Code Playgroud)
期望的解决方案
当我们控制服务时,因为我们已经实现了它,我们想在服务器端检查调用是否包含非utf-8字符,如果是,则以4xx http状态响应
当前的解决方案
检查每个字符(== string.substring(i,i + 1))
码
protected List< String > getNonUnicodeCharacters( String s ) {
final List< String > result = new ArrayList< String >();
for ( int i = 0 , n = s.length() ; i < n ; i++ ) {
final String character = s.substring( i , i + 1 );
final boolean isOtherSymbol =
( …Run Code Online (Sandbox Code Playgroud) 最近我在FindBugs上发布了关于暴露内部状态的警告,即当返回对数组的引用而不是返回数组的副本时.我创建了一些模板,以便更容易地转换代码.
您创建了哪一个支持防御性编程并希望与SO人群分享?
我到目前为止创建的模板(作为示例):
要创建要从方法返回的数组的副本,请执行以下操作:
final ${type}[] ${result} = new ${type}[ ${array}.length ];
System.arraycopy( ${array} , 0 , ${result} , 0 , ${array}.length );
Run Code Online (Sandbox Code Playgroud)
要克隆对象:
(${o}!= null?(${type})${o}.clone():null)
Run Code Online (Sandbox Code Playgroud) 按照设计,java中的枚举常量是单例,为了并发使用,我通常会创建无状态枚举实例并使用方法参数根据需要注入数据.
例:
目前我正在创建一个具有Operations的REST服务(使用策略模式的变体实现为枚举).
public enum Operation {
DO_THIS() {
public Result doSomething(Object theData) {
}
} ,
// Other Operations go here
;
public abstract Result doSomething(Object theData);
}
Run Code Online (Sandbox Code Playgroud)
现在我想收集有关操作被调用的频率以及成功频率等的数据.
我可以在使用枚举实例时从外部保存状态,但似乎状态应该保存在Operation中,因为操作应该包含它自己的状态.
现在我的一般问题是:
有状态的枚举实例(除了并发问题)是一个糟糕的设计吗?
最近我们最终将项目转换为Java 1.6.在执行测试时,我发现使用1.6时,不会抛出使用1.5抛出的SAXParseException.
下面是我的测试代码来演示这个问题.
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.SchemaFactory;
import org.junit.Test;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
/**
* Test class to demonstrate the difference between JDK 1.5 to JDK 1.6.
*
* Seen on Linux:
*
* <pre>
* #java version "1.6.0_18"
* Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
* Java HotSpot(TM) Server VM (build 16.0-b13, mixed mode)
* </pre>
*
* Seen on OSX:
*
* <pre>
* java version "1.6.0_17"
* Java(TM) SE Runtime Environment …Run Code Online (Sandbox Code Playgroud) 我拼命地寻找一种安装方法,svcutil.exe因为我在这里和其他地方读到,这是将WSDL编译为C#代码的方法。我通过Windows SDK安装进行了尝试,该安装产生了大约1K个安装程序的文件夹,我不知道该从哪个目录开始。任何指导表示赞赏。
注意:我目前正在使用Visual Studio 2017预览版,这与某种方式相关吗?
marshaller是否有办法生成一个跳过任何null属性的新xml文件?因此someAttribute =""之类的内容不会出现在文件中.
谢谢